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

четвертый. Избавление от strlen


Возвращаясь к рис. 0x004 отметим, что обращение к не выровненным данным – не единственная горячая точка функции Calculate CRC. С небольшим отрывом за ней следует инструкция PUSH, временно сохраняющая регистры в стеке и… опять та противная strlen

с которой мы уже столкнулись.

Действительно, вычисление длины пароля вполне сопоставимо по времени с подсчетом его контрольной суммы. Вот если бы этого удалось избежать… А для собственно, вообще вычислять длину каждого пароля? Ведь пароли перебираются не хаотично, а генерируется по вполне упорядоченной схеме и приращение длины пароля на единицу происходит не так уж и часто. Так, может быть, лучше возложить эту задачу на функцию gen_pswd? Пусть при первом вызове она определяет длину начального пароля, а затем при "растяжке" строки увеличивает глобальную переменную length на единицу. Сказано – сделано.

Теперь код gen_pswd выглядит так:

       int a;

       int p = 0;

       length = strlen(pswd);            // определение длины начального пароля

       …

       if (!pswd[p])

       {

              pswd[p]=' ';

              pswd[p+1]=0;

              length++;            // "ручное" увеличение длины пароля

       }

       …

Листинг 16 Удаление функции strlen и "ручное" приращение длины пароля при его удлинении на один символ

А код Calculate CRC так:

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

Листинг 17 Использование глобальной переменной для определения длины пароля

В результате этих нехитрых преобразований мы получаем скорость в… восемь миллионов паролей в секунду. Много? Подождите! Самое интересное еще только начинается…



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