Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Реализация алгоритма itoa10

24K
26 января 2007 года
noid
3 / / 26.01.2007
Мне была поставлена задача написать быстродействующую специализированную версию алгоритма по преобразованию целого числа в строку. Есть один вариант, довольно сильно оптимизированный, с поддержкой wchar_t. Хочу попросить знатоков С++ раскритиковать эту реализацию, найти улучшения и т.п. :)

Вот сам алгоритм:

Код:
[FONT="Courier New"]template <typename C>
C get_digit_char( int i )
{
    static const C chars[19] =
    {
        '9', '8', '7', '6', '5', '4', '3', '2', '1',
        '0',
        '1', '2', '3', '4', '5', '6', '7', '8', '9'
    };

    static C const* mid = chars + 9;
    return mid;
}


template <typename C>
C const* itoa10( int num, C* buffer, size_t bufSize )
{
    C* pos = buffer + bufSize - 1;
    *pos = 0;
    int isign = num < 0;

    do
    {
        int t = num % 10;
        num /= 10;
        --pos;
        *pos = get_digit_char<C>( t );
    }
    while( num != 0 );

    if ( isign )
    {
        --pos;
        *pos = '-';
    }

    return pos;
}
[/FONT]
7.6K
26 января 2007 года
Darien
125 / / 15.01.2006
Извращение какоето. Зачем делать 2 функции вместо одной ? преобразование числа в символ нужно импользовать как a -+ '0' 2) Кэширование в массив производительности не прибавляет. 3) нафига здесь шаблоны ? если там будет будет класс, то всё загнётся. 4) нафига
размер буффера ? это снижает удобство функции.
11K
26 января 2007 года
.nornad
125 / / 04.01.2007
Не проще ли использовать для этого стандартную функцию? Или хотя бы использовать две функции (под char/wchar_t)?

Есть один мудрый закон (вообще по жизни, а не только в программировании):
Больше универсальность - больше проблем и меньше мест приложения.
63
26 января 2007 года
Zorkus
2.6K / / 04.11.2006
Вопрос автору - чем тебе не хватает быстродействия стандартных функций преобразования? И какая задача стоит перед тобой, для чего нужна такая функция, которую ты пишешь?
24K
26 января 2007 года
noid
3 / / 26.01.2007
Постараюсь ответить всем.

4 Darien.
1) вторая функция пользователю не мешает, он ее не видит, но она кое-что дает;
2) метод " a + '0' " не будет работать для wchar_t;
3) это не кэширование, а индексация, которая, действительно, не прибавляет производительности, а решает другую задачу: отсутствие обратной перестановки цифр после деления на 10 (попробуй реализовать этот алгоритм сам, поймешь зачем);
4) Причем здесь класс я не понял, шаблон ориентирован только на 2 типа: char и wchar_t, как в таких случаях часто и бывает;
5) указание размера буфера позволяет применить указанную ранее оптимизацию, к тому же это соответствует стандарту безопастности по проверке длины передаваемого буфера.

4 .nornad
Стандартная функция медленнее примерно раза в 2 (MSVC 2005), так как поддерживает произвольный radix, а эта оптимизирована на 10. Стандартные функции не всегда оптимальны, почитай "Практику программирования" Кернигана.

4 Zorkus
Это нужно для приложения, к котором это функция вызывается очень часто. Не скажу, что это убедительный аргумент :), но превосходство по быстродействию все же имеет значение.
63
26 января 2007 года
Zorkus
2.6K / / 04.11.2006
Цитата: noid

4 Zorkus
Это нужно для приложения, к котором это функция вызывается очень часто. Не скажу, что это убедительный аргумент :), но превосходство по быстродействию все же имеет значение.


Я понимаю, это может быть коммерческой тайной. Но все же, может расскажешь поподробней о приложении?

24K
26 января 2007 года
noid
3 / / 26.01.2007
Это приложение предназначено для работы с большой базой данных на XML, содержащей много полей с числовыми данными и параметрами. Соотвественно, данные надо парсить и преобразовывать в числовой формат.
Но мне кажется, не суть важно, какая задача. Я понимаю, что первое правило оптимизации - не оптимизировать, но здесь необходимость оптимизации доказана.
7.6K
27 января 2007 года
Darien
125 / / 15.01.2006
[QUOTE=noid;169806]Постараюсь ответить всем.


//1) вторая функция пользователю не мешает, он ее не видит, но она кое-что дает;
Она программисту мешает.

//2) метод " a + '0' " не будет работать для wchar_t;
С утра работал.
//3) это не кэширование, а индексация, которая, действительно, не //прибавляет производительности, а решает другую задачу: отсутствие //обратной перестановки цифр после деления на 10 (попробуй //реализовать этот алгоритм сам, поймешь зачем);
Кэширование есть запоминание, с возможностью конкретного спецефического доступа. прежде чем спорить, изучите термины. Такие алгоритмы я в школе писал, о каком обратном порядке цифр идёт речь я понятия не имею, чушь какая-то.
//4) Причем здесь класс я не понял, шаблон ориентирован только на 2 //типа: char и wchar_t, как в таких случаях часто и бывает;
Ваш шаблон ориетирован на любой указатель. "А причём тут класс" - объясняю: если подать туда std::string , то работать не будет очевидно, поэтому функция не универсальна.
3
27 января 2007 года
Green
4.8K / / 20.01.2000
Цитата: noid
Хочу попросить знатоков С++ раскритиковать эту реализацию, найти улучшения и т.п. :)


Отвратительно!
1. С++ здесь нет, если не считать совершенно ненужного шаблона.
2. Функция get_digit_char совершенно не нужна. Проще и быстрее привести исходное число к абсолютному значению и далее для цифр использовать n+'0'. Это работает как для char, так и для wchar_t.
3. Когда я передаю буфер в функцию, я жду что он будет заполнен от начала, а не от середины.

Цитата: noid

Я понимаю, что первое правило оптимизации - не оптимизировать, но здесь необходимость оптимизации доказана.


Приведи доказательство. Сомневаюсь, что это самая токнкая часть всей системы. Так жен сомневаюсь, что стандартный itoa в два раза медленнее. И уж совсем не согласен, что из-за radix.

1.9K
27 января 2007 года
[*]Frosty
278 / / 17.06.2006
[QUOTE=noid]5) указание размера буфера позволяет применить указанную ранее оптимизацию, к тому же это соответствует стандарту безопастности по проверке длины передаваемого буфера.[/QUOTE]
Я никакаой проверки не виду) Там прямое переполнение)

[QUOTE=noid]Это приложение предназначено для работы с большой базой данных на XML, содержащей много полей с числовыми данными и параметрами. Соотвественно, данные надо парсить и преобразовывать в числовой формат. [/QUOTE]
Ф. преобразует число в "данные"??? Ты нечего не путаешь?

А вот с реализацией ф. C get_digit_char( int i ) впоне согласен, нельзя привязываться в кодировке), нужно четко назначить числу его символьное представление).
З.Ы. А шаблоны как-то лишне выгледят
3
27 января 2007 года
Green
4.8K / / 20.01.2000
[QUOTE='
  • Frosty;169884']
    А вот с реализацией ф. C get_digit_char( int i ) впоне согласен, нельзя привязываться в кодировке), нужно четко назначить числу его символьное представление).
    [/QUOTE]
    Почему это нельзя? Конкретное документальное подтверждение, пожалуйста.
    Более того, ты согласен, что вместо абсолютного значения надо использовать массив двойного размера?
  • 1.9K
    27 января 2007 года
    [*]Frosty
    278 / / 17.06.2006
    Я не совсем прав) извеняюсь
    Для цифр во всех кодировках есть правило
    Цитата:
    # Коды десятичных цифр 0—9 должны идти в возрастающем порядке, причём коды двух соседних цифр должны отличаться на единицу.


    А вот для букв точно привязываться нельзя, так как о порядке их слевования нет никакой инфы)

    Цитата:
    # Коды всех символов из этого набора должны быть представимы одним байтом (т. е. не должны превышать 255).


    И усё)
    Я поторопился, подумав, что для цифр тоже самое.

    Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
    Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог