Re[4]: sprintf/sscanf и скорость - понятия совместимые ?
От: balearic chill  
Дата: 01.08.03 06:09
Оценка: +1
Здравствуйте, 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, может из-за оптимизации, не знаю.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.