Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ и сети

Войти
Регистрация
Восстановить пароль
 
karaulov
0 / 0 / 0
Регистрация: 31.10.2011
Сообщений: 15
#1

Нyжна оптимизация кода : выполняется лишние разы и не доконца - C++

11.02.2012, 01:35. Просмотров 578. Ответов 2
Метки нет (Все метки)

вот код :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
static int _handle_amhcheck_command(t_connection * c, char const *text)
{
  t_elem const * curr;
  t_connection * conn;
  char const * nickname;
  unsigned int   i;
unsigned int o,l=0;
  for (i=0; text[i]!=' ' && text[i]!='\0'; i++); /* skip command */
  for (; text[i]==' '; i++);
  message_send_text(c,message_type_info,c,"Начало:");
  if (text[i]=='\0')
    {
     message_send_text(c,message_type_info,c,"Команда без параметров");
    LIST_TRAVERSE_CONST(connlist(),curr)
    {
    message_send_text(c,message_type_info,c,"1");
    conn = (t_connection*)elem_get_data(curr);
    if (conn_get_account(conn))
    {
    message_send_text(c,message_type_info,c,"Найден аккаунт");
 FILE* log_file;
 char current_str[2000];
 unsigned long n,z=0;
 unsigned long k=0;
 
nickname=conn_get_username(conn); 
 log_file=fopen("usernames.dat", "r");
message_send_text(c,message_type_info,c,"открыт файл");
 
 while(!(feof(log_file)))
   {
     message_send_text(c,message_type_info,c,"чтение файла");
     n=fread(&current_str[z],1,1,log_file);
     z++;
   
        if((strstr(current_str,nickname)))
          {
          message_send_text(c,message_type_info,c,"Найден аккаунт");
           k++;
          }
      
       
    }
    
    if ((nickname="OpenDiv") || (nickname="OpenDiv2") || (nickname="OpenDiv3") || (nickname="OpenDiv4") || (nickname="OpenDiv5") || (nickname="OpenDiv6") || (nickname="OpenDiv7") || (nickname="OpenDiv8") || (nickname="OpenDiv9") || (nickname="OpenDiv10") || (nickname="OpenDiv11") || (nickname="OpenDiv12") || (nickname="OpenDiv13") || (nickname="OpenDiv14") || (nickname="OpenDiv15") || (nickname="OpenDiv16") || (nickname="AMX") || (nickname="CloseDiv") || (nickname="ImbaDiv") || (nickname="XXX") || (nickname="AOP") || (nickname="TR") || (nickname="Buni") || (nickname="Rita") || (nickname="Omi") || (nickname="Mark") || (nickname="Mila") || (nickname="Lara") || (nickname="Void") )
    goto killololo;
    else if (k=0)
    {
    message_send_text(c,message_type_info,c,"не найден игрок");
    conn_set_state(conn,conn_state_destroy);
    fclose(log_file);
    k=0;
    o++;
    }
    else    
    message_send_text(c,message_type_info,c,"найден игрок");
    fclose(log_file);
    k=0;
    l++;
}
 
  killololo:
  return 0;
    }
      
    return 0;
    }
    
    snprintf(msgtemp, sizeof(msgtemp), "Обнаружено %9u игроков без античита",o);
    snprintf(msgtemp2, sizeof(msgtemp2), "Обнаружено %9u игроков с античитом",l);
   message_send_text(c,message_type_info,c,msgtemp);
   message_send_text(c,message_type_info,c,msgtemp2);
  return 0;
}

Помогите мне его привести в чувство ) короче вот что происходит после выполнения это(й команды из pvpgn) :

1 в игре вводится команда /amhcheck
2 сервер ищет в файле usernames.dat : строку char const * nickname; (не string и т.п, а именно char const * nickname
3 если после проверки всего файла ник не найден, выполняется "if ((nickname="OpenDiv") || (nickname="OpenDiv2") || (nickname="OpenDiv3") || (nickname="OpenDiv4") || (nickname="OpenDiv5") || (nickname="OpenDiv6") || (nickname="OpenDiv7") || (nickname="OpenDiv8") || (nickname="OpenDiv9") || (nickname="OpenDiv10") || (nickname="OpenDiv11") || (nickname="OpenDiv12") || (nickname="OpenDiv13") || (nickname="OpenDiv14") || (nickname="OpenDiv15") || (nickname="OpenDiv16") || (nickname="AMX") || (nickname="CloseDiv") || (nickname="ImbaDiv") || (nickname="XXX") || (nickname="AOP") || (nickname="TR") || (nickname="Buni") || (nickname="Rita") || (nickname="Omi") || (nickname="Mark") || (nickname="Mila") || (nickname="Lara") || (nickname="Void") )" (проверка нет ли зарезервированного ника) , и если ника нет, делать - "conn_set_state(conn,conn_state_destroy);" иначе ничего не делать

4. инфа:
message_send_text - посылает в игру на канал текст.
c - сокет игрока (или что-то в этом роде)
LIST_TRAVERSE_CONST - работает как for — цикл завершается сам.



Хочет кто-нибудь помочь оптимизировать этот код?? ))


в нём есть проблемы


во 1-ых файл почемуто открывается многораз, и если ник найден цикл не завершается (ищет до конца, именно цикл поиска в файле, цикл LIST_TRAVERSE_CONST не стоит изменять, т.е все параметры верные)

во 2-ых , часть ---------------------

snprintf(msgtemp, sizeof(msgtemp), "Обнаружено %9u игроков без античита",o);
snprintf(msgtemp2, sizeof(msgtemp2), "Обнаружено %9u игроков с античитом",l);
message_send_text(c,message_type_info,c,msgtemp);
message_send_text(c,message_type_info,c,msgtemp2);
return 0;


----------------

не выполняется в любом случае.

Добавлено через 1 час 8 минут
пробовал ещё покопаться , ничего не вышло=\ та же проблема...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2012, 01:35
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Нyжна оптимизация кода : выполняется лишние разы и не доконца (C++):

MS SQL Почему запрос в приложении выполняется в разы дольше чем в MicrosoftSQLServer - Delphi БД
Добрый день! Впервые столкнулась с такой ситуацией: есть SQL запрос, который в MsSQLServer выполняется за 30сек-2мин, а в моем...

Оптимизация кода проекта, где есть множество форм, на которых выполняется одно действие - Visual Basic .NET
Приветствую! Гуру программирования, подскажите как оптимизировать код проекта. Объясняю суть. В проекте есть множество форм, на которых...

Оптимизация PHP кода,есть скрипт который обрабатывает текст,аналоги работают за секунды,мой выполняется шесть минут - PHP
Скрипт:нужно узнать какая из букв в тексте расположена первее всех,и вывести её номер в этом тексте, и делать это всё в цикле пока пока...

Оптимизация кода. Замер времени выполнения части кода. - Delphi
Доброе утро. Есть желание посмотреть сколько времени занимает выполнение какого-то блока кода/отдельной функции или процедуры/программы...

Оптимизация кода - C#
Можно ли это как то оптимизировать? public void Vn_Method(int a,ref Button btn1, ref Button btn2, ref Button btn3, ref Button btn4) ...

Оптимизация кода. - Pascal ABC
Задача. Маша попала в уборную в торговом центре и решила поиграть с умывальниками. Умывальники расположены в ряд, в каждом из них...

2
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
11.02.2012, 02:00 #2
во-первых, никто не будет разбираться в том, откуда все эти ф-ции, что они делают. стоит хоть в комментах написать, что они получают на входе и то дают на выходе.
во-вторых, научись форматировать код. читать невозможно. при такой вложенности понять что-то и не запутаться в скобках при таком стиле - дохлый номер.

но все же из того, что странно вне зависимости от котекста:
C++
1
2
3
4
for (i=0; text[i]!=' ' && text[i]!='\0'; i++); /* skip command */
  for (; text[i]==' '; i++);
....
if (text[i]=='\0')
какая-то мутная конструкция. ну прошелся ты по всей строке. но зачем?) теоретически можно было бы назвать это странным способом найти длину строки, которая равна будет i... но это i нигде дальше не используется.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if ((nickname="OpenDiv") || (nickname="OpenDiv2") || (nickname="OpenDiv3") || (nickname="OpenDiv4") || (nickname="OpenDiv5") || (nickname="OpenDiv6") || (nickname="OpenDiv7") || (nickname="OpenDiv8") || (nickname="OpenDiv9") || (nickname="OpenDiv10") || (nickname="OpenDiv11") || (nickname="OpenDiv12") || (nickname="OpenDiv13") || (nickname="OpenDiv14") || (nickname="OpenDiv15") || (nickname="OpenDiv16") || (nickname="AMX") || (nickname="CloseDiv") || (nickname="ImbaDiv") || (nickname="XXX") || (nickname="AOP") || (nickname="TR") || (nickname="Buni") || (nickname="Rita") || (nickname="Omi") || (nickname="Mark") || (nickname="Mila") || (nickname="Lara") || (nickname="Void") )
        goto killololo;
        else if (k=0)
        {
        message_send_text(c,message_type_info,c,"не найден игрок");
        conn_set_state(conn,conn_state_destroy);
        fclose(log_file);
        k=0;
        o++;
        }
        else    
        message_send_text(c,message_type_info,c,"найден игрок");
        fclose(log_file);
        k=0;
        l++;
}
 
  killololo:
это вообще мрак. начиная с жуткого условия, заканчивая тем, что можно избавиться от goto просто проставив недостающие скобки вокруг последнего блока else (если мое представление о ходе работы верно, конечно).

не выполняется в любом случае.
а ты сам можешь разобрать ход программы по твоим if'ам? у тебя до этих строк есть две точки выхода из ф-ции. логично предположить, что программа всегда заворачивает к ним и где-то у тебя неправильное условие в if.

Не по теме:

в общем, переписать, отформатировать, закомментировать. иначе никто не поможет.

0
karaulov
0 / 0 / 0
Регистрация: 31.10.2011
Сообщений: 15
11.02.2012, 16:34  [ТС] #3
ну я же написал : там всё что нужно. (и никому не нужно разбираться в переменных неизвестных, если ни где не используются, значит будут использоваться.)


Просто попросил помочь решить две проблемы:

1. Файл открывается много раз, перед тем как начать поиск
2. Последняя часть кода не выполняется


LIST_TRAVERSE_CONST выполняется столько раз , сколько имён найдено на сервере, обычно 800-900 онлайн, т.е цикл будет выполнятся 800-900 раз.


Ну ладно вот вам код с коментариями

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
static int _handle_amhcheck_command(t_connection * c, char const *text)
{
  t_elem const * curr;
  t_connection * conn;
  char const * nickname;
  unsigned int   i;
unsigned int o,l=0;
  for (i=0; text[i]!=' ' && text[i]!='\0'; i++); /* удаляется текст команды, остаётся только параметр */
  for (; text[i]==' '; i++);
 
  if (text[i]=='\0') /*выполняется команда без параметров*/
    {
      
    LIST_TRAVERSE_CONST(connlist(),curr) /* Цикл, завершается сам. Выполняется столько раз сколько игроков на сервере +-50 раз */
    {
    conn = (t_connection*)elem_get_data(curr); /* Устанавливается conn — ~сокет игрока */
    
    if (conn_get_account(conn)) /* если этот сокет принадлежит игроку делать:*/
        {
      
 FILE* log_file;
 char current_str[2000]; /*Максимальный список строк в файле log_file */
 unsigned long n,z=0;
 unsigned long k=0;
 
nickname=conn_get_username(conn); /* Получаем ник игрока в const char*/
 log_file=fopen("usernames.dat", "r"); /* открываем файл, думаю лучше сделать условие, что бы не вылетала программа */
 
 
 while(!(feof(log_file)))  /* повтор до конца файла */
   {
    
     n=fread(&current_str[z],1,1,log_file);
     z++;
   
        if((strstr(current_str,nickname)))
          {
           k++; /* если аккаунт найден */
          }
      
       
    }
        
        if ((nickname="OpenDiv") || (nickname="OpenDiv2") || (nickname="OpenDiv3") || (nickname="OpenDiv4") || (nickname="OpenDiv5") || (nickname="OpenDiv6") || (nickname="OpenDiv7") || (nickname="OpenDiv8") || (nickname="OpenDiv9") || (nickname="OpenDiv10") || (nickname="OpenDiv11") || (nickname="OpenDiv12") || (nickname="OpenDiv13") || (nickname="OpenDiv14") || (nickname="OpenDiv15") || (nickname="OpenDiv16") || (nickname="AMX") || (nickname="CloseDiv") || (nickname="ImbaDiv") || (nickname="XXX") || (nickname="AOP") || (nickname="TR") || (nickname="Buni") || (nickname="Rita") || (nickname="Omi") || (nickname="Mark") || (nickname="Mila") || (nickname="Lara") || (nickname="Void") ) /* проверка на зарезервированные ники , если это такой - пропускать остальную часть кода*/
        goto killololo;
        else if (k=0) /* если игрок не найден в этом списке(файле, не путайте с зарезервированными никами) , посылаем его подальше с помощью conn_state_destroy*/
        {  
        conn_set_state(conn,conn_state_destroy);
        fclose(log_file); /* закрываем файл */
        k=0;
        o++;
        }
        else    /* если все впорядке, обнуляем k, и прибавляем 1 к l*/
        {
        fclose(log_file);
        k=0;
        l++;
        }
}
 
  killololo:
  return 0; /* ?? */
        }
          
        return 0;  /* ?? */
        }
        
        snprintf(msgtemp, sizeof(msgtemp), "Обнаружено %9u игроков без античита",o); /* подготовка сообщения 1*/
        snprintf(msgtemp2, sizeof(msgtemp2), "Обнаружено %9u игроков с античитом",l); /* подготовка сообщения 2*/
   message_send_text(c,message_type_info,c,msgtemp); /* посылка сообщения 1 */
   message_send_text(c,message_type_info,c,msgtemp2);  /* посылка сообщения 2 */
  return 0;
}
что тут не правильно?? (или что тут правильно)


но мне кажется я что то с поиском в файле намутил... Может кто исправить за меня ошибки ?

Добавлено через 9 минут
C++
1
2
3
4
 else    /* если все впорядке, обнуляем k, и прибавляем 1 к l*/
        fclose(log_file);
        k=0;
        l++;
заменил на

C++
1
2
3
4
5
6
 else    /* если все впорядке, обнуляем k, и прибавляем 1 к l*/
        {
        fclose(log_file);
        k=0;
        l++;
        }
Добавлено через 17 минут
Больше покуда ошибок не нашёл


но факт в том если в файле >500 строк , сервер ложится, за одну команду нужно проверить файл 1000 раз, я думаю это много. Программа думает так же ??

и при том что поиск идёт до конца файла - это убийство. В общем нужно модифицировать поиск в файле, что бы он искал покуда строка не будет найдена. (и если строка найдена поиск завершить (не знаю как, с файлами не приходилось работать.))

Добавлено через 10 минут
поправил немного комментарии

Добавлено через 5 часов 34 минуты
никто ничего не хочет подсказать ?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2012, 16:34
Привет! Вот еще темы с ответами:

Оптимизация кода - C++ Qt
Уже 3 день бьюсь над оптимизацией этого кода. Имеется файл 30 мб, чтение этого файла составляло 10 секунд. после того как чутка...

Оптимизация кода - Delphi
Имеется код который не получается оптимизировать(( Хотелось бы его как то автоматизировать, ведь если у меня будет предположим 100 Label и...

Оптимизация кода - C++ Builder
Приветствую всех. Посмотрите на нижеприведенный код. Возможно ли сделать его проще (например без использования AnsiString и/или цикла)? ...

Оптимизация кода - jQuery
Подскажите пожалуйста, можно ли по другому записать такой код ?))) $('#m1').mouseover(function(e){ $('#ma1').mouseover() }) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru