Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> hex to int, оптимизация по скорости 
:(
    Опции темы
mes
Дата 7.2.2011, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



GoldFinch, если *16 убрать  (допустим заменив на +16), производительность сильно увеличивается ?
если да, то  "полезный" ряд  (где не -1) таблицы можно сделать косвенным,  и представить как отображение на двухмерный массив чисел, 
значение которого равно pow (0x10, строка) +столбец.

тогда для 4х-значных 16-ричных чисел потребуется 4*16*sizeof(int) дополнительной памяти и одно косвенное обращение к ней..

Добавлено @ 20:50
если ничего не напутал smile

Это сообщение отредактировал(а) mes - 8.2.2011, 00:32


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 7.2.2011, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



GoldFinch, вообще-то так и предполагал, но точно не знал. Жалко.

А у меня ещё столько идей ... (С) какой-то анекдот про Вовочку smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 8.2.2011, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(mes @  7.2.2011,  19:48 Найти цитируемый пост)
, если *16 убрать 

вот накалякал, развернув цикл: http://liveworkspace.org/code/3884c626a705...594cf3ea895ebe5
осталось сравнить по скорости.. 

 



--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 8.2.2011, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



mes, там должно быть 8 цифр, а не 4.

если сделать 8 - то производительность будет такой же как и в моей версии.
http://paste.org.ru/?wixlwl
PM MAIL ICQ   Вверх
mes
Дата 8.2.2011, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(GoldFinch @  8.2.2011,  01:27 Найти цитируемый пост)
если сделать 8 - то производительность будет такой же

да, я вчера чего то упустил из виду, что *16 и так оптимальное.. так что tabled_mul излишний..
так что надежда могла быть лишь на исключение лишний операций, при развороте цикла.. 
хотя исключение пары сдвигов на общем фоне заметно не будет.. так же как и пользы от замены "+" на "|"...




--------------------
PM MAIL WWW   Вверх
volatile
Дата 9.2.2011, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Сегодня немного повозился с вашей функцией.
оптимизировать её практически бесполезно, так как на вызов/возврат тратится больше времени.
чем собственно на само тело функцию. Если есть возможность ее надо вызывать инлайн.

Но тем не менее, вот что получилось:
Код

int parse_hex_table2(const char * & s)
{
    // char[] заменил на int[] 
    // меньше преобразований char<->int дало львиную долю ускорения на ~12%

    // В таблицу добавил смещение.
    const int k = 1; // Есть смысл выбирать только между k=1 и k=0.  при k=0 вернется к тому что было.
                     // при k=1 дало ускорение ~1-2% см.ниже.
    static const int table[256] =
    {
      // 0     1     2     3     4     5     6     7     8     9     A     B     C     D     E     F 
        -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, // 00
        -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, // 10
        -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, // 20
        +0+k,  1+k,  2+k,  3+k,  4+k,  5+k,  6+k,  7+k,  8+k,  9+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, // 30
        -1+k, 10+k, 11+k, 12+k, 13+k, 14+k, 15+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, // 40
        -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, // 50
        -1+k, 10+k, 11+k, 12+k, 13+k, 14+k, 15+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, // 60
        -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, // 70
        -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, // 80
        -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, // 90
        -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, // A0
        -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, // B0
        -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, // C0
        -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, // D0
        -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, // E0
        -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, -1+k, // F0
    };    

    int hexNum;
    const char * pos = s;
       {
          int value = table[(unsigned char)*pos];
          if( value == k - 1 ) return 0; // при к=1 фактически имеем сравнение (value==0) что на ~1-2% быстрее чем (value==-1)
          ++pos;                         // Даже с учетом последующей корректировки результата.
          hexNum = value - k;
       }
    for(;;)
    {
          // Нижеслеюующий блок можно дублировать
          // Пробовал дублировать до 8 раз. реальной производительности не увеличивается, даже наоборот
          // Но возможно на другой машине будет по другому. (Зависит от кеша процессора). Оставил 2 раза. 
       {  
          int value = table[(unsigned char)*pos];
          if( value == k - 1 ) break;
          ++pos;
          hexNum = hexNum * 16 + value - k;
       }
       {  
          int value = table[(unsigned char)*pos];
          if( value == k - 1 ) break;
          ++pos;
          hexNum = hexNum * 16 + value - k;
       }
    }
    s = pos;
    return hexNum;
}


Результаты по времени на моём компе.
исходный вариант - 100%
этот вариант ~ 84.8%


Это сообщение отредактировал(а) volatile - 9.2.2011, 00:54
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0965 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.