Здравствуйте, YVR, Вы писали:
YVR>Так по специфике можно не слабо заточить
YVR>(и без автоматов
— там выигрыш по данным автора меньше чем в 10 раз)
YVR>Например такой дубовый (не самый оптимальный
) код (без проверок — специфика ведь
):
YVR>...
YVR>работает почти в 100 раз быстрее (на VC6 release, 4-й пень), чем:
YVR>...
Ну последние два дня я только и занимаюсь что по специфике затачиваю, а в автоматах я разачаровался — в тексте про проверку флоатов/емэйлов который мне порекомендовали, автор сравнивает производительность sscanfa который все же
число вычисляет, с производительностью своей процедурки верификации, которая только да/нет выдает ...
после чего с гордостью обнаруживает большое превосходство по скорости ... герой, блин.
Есть более серьезные примеры на автоматы, но я по их внешнему виду вижу что все это тормозить будет.
За код Вам спасибо, у меня примерно то же самое только еще более специфичное: точку не ищу, потому что знаю где она,
ну и еще там по мелочи ... на процентов 7 мой вариант всего лишь быстрей.
Переписал и sscanf и sprintf даже без str* функций (они оказывается тоже тормозят заразы), только memcpy не стал
переписывать (понадеюсь что хотя бы в ней MS не лажанулась).
Вот две базовые функции (через них FastSscanf и FastSprintf работают, но там специфика — неинтересно):
// предполагаем что пробелы есть
long FastAtol(char *s) {
long sign = 1, res = 0, i = 0;
while(s[i] == ' ') i++;
if(s[i] == '-') { i++; sign = -1; }
while(s[i] != ' ' && s[i] != NULL) {
res *= 10;
res += s[i++] - '0';
}
return sign*res;
}
// возвращаем кол-во символов в s, полезно чтобы потом не тратить время на strlen
long FastLtoa(char *s, long n) {
char temp[20];
long i = 19, pos = 0;
if(n < 0) { s[0] = '-'; pos = 1; }
if(n < 10) { s[pos] = (char)n + '0'; s[pos+1] = NULL; return pos+1; }
if(n < 100) { s[pos] = (char)(n/10) + '0'; s[pos+1] = (char)(n%10) + '0'; s[pos+2] = NULL; return pos+2; }
do {
temp[i--] = (char)(n%10) + '0';
n /= 10;
} while(n);
while(i <= 18) s[pos++] = temp[++i];
s[pos] = NULL;
return pos;
}
Кстати на P4, VC.NET производительность всего в 50 раз больше, а не в 100, может из-за оптимизации, не знаю.