snprintf vs ?

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

snprintf vs ?

Anton Maksimenkov
Здраствуйте, openbsd.

Предвариловка.
Некоторое время назад читал книжку, там описывалось CGI, и были
маленькие программки в качестве примеров. В описании было кратко
сказано, типа "вот мы тут пользуем sscanf() для перекодировки символа,
но *scanf() довольно медлительны..." вобщем читателю предлагается
самостоятельно разработать быстрые алгоритмы перевода чисел в строки.

Собственно тема.
Неадвно буквально написал я программу (но не CGI, а демон), которая
довольно критична ко времени исполнения цикла обработки клиента. Хотя,
конечно какой же сервер не критичен к этому... Ну вобщем суть в том,
что в процессе обработке происходит множество преобразований цифр из
текста в число и наоборот - точнее *char <-> int.
Для этого применяются соответственно strtonum() и *printf(). Сначала
делал на asprintf(), думал будет немного и чтобы стек не засирать.
Потом код распухал, стало неудобно отслеживать и освобождать этот
указатель при всех возможных ошибках и выходах функций... Да и мелко и
часто выделять динамично память показалось неоправданной нагрузкой.
Переделал под snprintf().
После того как заработала бета-версия, прикинул количество *printf() и
задумался: "а что как это дело 'довольно медлительно' и притормаживает
процесс?" Нет ли "специализированной", быстрой функции число-в-строку?

--
engineer


Reply | Threaded
Open this post in threaded view
|

Re: snprintf vs ?

Alex Kirhenshtein
я бы не заморачивался. автор говорил про scanf, который раза в три (если
не больше) медленей, чем ato*. ato* функции и будут тем быстрым
переводом. а если вам не хватает скорости, то надо менять архитектуру, а
не системные функции -- написанные не самыми глупыми людьми.

для примера, 1000000 итераций snprintf+atoi:

alk@ns$ time ./te

real    0m2.237s
user    0m2.176s
sys     0m0.009s
alk@ns$ dmesg |grep -i CPU
CPU: Pentium II/Pentium II Xeon/Celeron (400.91-MHz 686-class CPU)


[hidden email] wrote:

> Здраствуйте, openbsd.
>
> Предвариловка.
> Некоторое время назад читал книжку, там описывалось CGI, и были
> маленькие программки в качестве примеров. В описании было кратко
> сказано, типа "вот мы тут пользуем sscanf() для перекодировки символа,
> но *scanf() довольно медлительны..." вобщем читателю предлагается
> самостоятельно разработать быстрые алгоритмы перевода чисел в строки.
>
> Собственно тема.
> Неадвно буквально написал я программу (но не CGI, а демон), которая
> довольно критична ко времени исполнения цикла обработки клиента. Хотя,
> конечно какой же сервер не критичен к этому... Ну вобщем суть в том,
> что в процессе обработке происходит множество преобразований цифр из
> текста в число и наоборот - точнее *char <-> int.
> Для этого применяются соответственно strtonum() и *printf(). Сначала
> делал на asprintf(), думал будет немного и чтобы стек не засирать.
> Потом код распухал, стало неудобно отслеживать и освобождать этот
> указатель при всех возможных ошибках и выходах функций... Да и мелко и
> часто выделять динамично память показалось неоправданной нагрузкой.
> Переделал под snprintf().
> После того как заработала бета-версия, прикинул количество *printf() и
> задумался: "а что как это дело 'довольно медлительно' и притормаживает
> процесс?" Нет ли "специализированной", быстрой функции число-в-строку?
>


--
Alex Kirhenshtein
C.T.Co
Cellular: +371-9145688


Reply | Threaded
Open this post in threaded view
|

Re: snprintf vs ?

Demon-3
In reply to this post by Anton Maksimenkov


On Mon, 14 Nov 2005 [hidden email] wrote:

> Здраствуйте, openbsd.
>
> Предвариловка.
> Некоторое время назад читал книжку, там описывалось CGI, и были
> маленькие программки в качестве примеров. В описании было кратко
> сказано, типа "вот мы тут пользуем sscanf() для перекодировки символа,
> но *scanf() довольно медлительны..." вобщем читателю предлагается
> самостоятельно разработать быстрые алгоритмы перевода чисел в строки.
>
> Собственно тема.
> Неадвно буквально написал я программу (но не CGI, а демон), которая
> довольно критична ко времени исполнения цикла обработки клиента. Хотя,
> конечно какой же сервер не критичен к этому... Ну вобщем суть в том,
> что в процессе обработке происходит множество преобразований цифр из
> текста в число и наоборот - точнее *char <-> int.
> Для этого применяются соответственно strtonum() и *printf(). Сначала
> делал на asprintf(), думал будет немного и чтобы стек не засирать.
> Потом код распухал, стало неудобно отслеживать и освобождать этот
> указатель при всех возможных ошибках и выходах функций... Да и мелко и
> часто выделять динамично память показалось неоправданной нагрузкой.
> Переделал под snprintf().
> После того как заработала бета-версия, прикинул количество *printf() и
> задумался: "а что как это дело 'довольно медлительно' и притормаживает
> процесс?" Нет ли "специализированной", быстрой функции число-в-строку?
>
> --
> engineer
>
>
>

Самый быстрый известный мне вариант - перекодирование чисел из
шестнадцатеричной формы в - это всего несколько команд ассемблера х86.
Если в демоне можно использовать хекс-числа и ассемблер, то стоит об этом
подумать.
Еще можно сделать очень быстрое перекодирование на основе массива на 256
эл-тов, где АСКИ - код символа адресует ячейку массива, в которой хранится
его значение.

А вообще мудрые люди советуют сначала оптимизировать алгоритм, а потом уже
код.