С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 1
Регистрация: 31.10.2011
Сообщений: 15

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

11.02.2012, 01:35. Показов 1025. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.02.2012, 01:35
Ответы с готовыми решениями:

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

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

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

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

но все же из того, что странно вне зависимости от котекста:
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
0 / 0 / 1
Регистрация: 31.10.2011
Сообщений: 15
11.02.2012, 16:34  [ТС]
ну я же написал : там всё что нужно. (и никому не нужно разбираться в переменных неизвестных, если ни где не используются, значит будут использоваться.)


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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.02.2012, 16:34
Помогаю со студенческими работами здесь

Оптимизация методом Ньютона (нахождение точки минимума). Оптимизация кода
MATLAB только начал осваивать. Попытался реализовать нахождение точки минимума методом Ньютона для функции 2*X12 - X1*X2 + 3*X22 -...

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru