ТЕХНИКА ОПТИМИЗАЦИИ ПРОГРАММ

       

седьмой. Объединение функций


На этот раз самой горячей точкой становится сохранение регистра ESI где-то глубоко внутри функции CalculateCRC. Это компилятор "заботливо" бережет его содержимое от посторонних модификаций. Несмотря на то, что количество используемых переменных в программе довольно невелико и в принципе обращений к памяти можно было бы и избежать, разместив все переменные в регистра, компилятор не в состоянии этого сделать, т.к. оптимизирует каждую функцию по отдельности.

Так давайте же, плюнув на структурность, объединим все наиболее интенсивно используемые функции (gen_pswd, do_paswd, Check CRC и Calculate CRC) в одну "супер-функцию".

Ее реализация может выглядеть например так:

int gen_pswd(char *crypteddata, char *pswd, int max_iter, int validCRC)

{

       int a, b, x;

       int p = 0;

       char *buff;

      

       int length = strlen(pswd);

       for(a = 0; a < max_iter; a++)

       {

              x = -1;       for (b = 0; b <= length;  b++) x += *(int *)((int)pswd + b);

              if (x==validCRC)

              {

                     buff = (char *) malloc(strlen(crypteddata));

                     strcpy(buff, crypteddata); DeCrypt(pswd, buff);

                     printf("CRC %8X: try to decrypt: \"%s\"\n", validCRC,buff);

              }

             

              while((++pswd[p])>'z')

              {

                     pswd[p] = '!';       p++; if (!pswd[p])

                     {

                           pswd[p]=' ';  pswd[p+1]=0;length++;

                     }

              }; p = 0;

       }

       return 0;

}

Листинг 18 Объединение функций gen_pswd, do_paswd, Check CRC и Calculate CRC

в одну супер функцию

Компилируем, запускаем… ой! прямо не верим своим глазам – тридцать пять миллионов паролей в секунду! А ведь казалось, что резерв быстродействия уже исчерпан. Ну и кто теперь скажет, что Pentium – медленный процессор? Генерация очередного пароля, вычисление и проверка его контрольной суммы укладывается в каких-то двадцать тактов…

Двадцать тактов?! Хм! Тут еще есть над чем поработать!



Содержание раздела