Высокий уровень производительности с низкой задержкой С++

Моя цель - найти самую быструю библиотеку С++ для кастования int в строку, наоборот и синтаксический анализ.

Любой, кто экспериментировал с производительностью С++, быстро поймет, что класс строк STL имеет ужасную производительность по сравнению с STF-арифметическими операциями.

Некоторые примеры тестов с моего 3,3 ГГц Intel, GCC, CentOS 5.5 machine:

memcpy        0.004000 microsec/op
atoi          0.025000 microsec/op
atof          0.133000 microsec/op
strtod        0.133000 microsec/op
atof          0.135108 microsec/op
(char) uchar  0.001801 microsec/op
(char) ushort 0.001801 microsec/op
cache accs    0.010505 microsec/op
maplookup     0.128534 microsec/op
add_int       0.002456 microsec/op

Вы можете быстро увидеть, что строковые операции станут узким местом для любых приложений с высокой скоростью обмена сообщениями.

У меня есть другие библиотеки для высокопроизводительных строк (перечислены), но я пишу, надеясь, что у кого-то была схожая проблема, и достигло некоторого решения, возможно, включая написание собственного класса строк.

Ответы

Ответ 1

Вы не предоставили много информации о своих серверах, но посмотрите на эти библиотеки от AMD и Intel:

AMD String Library

Интегрированные показатели производительности Intel

Оба используют расширения SSE для ускорения операций с строкой.

Насколько я вижу, у них нет atoi(), но вы можете использовать библиотеки для поиска десятичных знаков во входе. Учитывая расположение и длину строки, должно быть тривиально записывать преобразование, используя встроенные функции SSE.

Ответ 2

Я написал свой собственный класс строк (gstring). Это только заголовок и позволяет мне повторно использовать буферы стека и легко переносить строки C. Включено целочисленное кодирование. Целочисленное декодирование является оберткой вокруг strtol.

Позволяет легко анализировать строки:

uint32_t pos = 0
gstring gs1 = gstr.netstringAt (pos, &pos); // gs1 is a *view* into gstr
gstring gs2 = gstr.netstringAt (pos, &pos);
int int1 = gstr.intAt (pos, &pos); if (gstr[pos] == ',') ++pos;
int int2 = gstr.intAt (pos, &pos); if (gstr[pos] == ',') ++pos;

Там также Str, но его поведение на 64-битной платформе мне не очень понятно.
Там также FBString. Они обещают, что конверсии "folly:: to" выполняются быстро.

Ответ 3

Отправить все в шестнадцатеричном формате ASCII и записать процедуры преобразования на языке ассемблера.

Ответ 4

Возможно, вы захотите посмотреть http://alexott.blogspot.fr/2010/01/boostspirit2-vs-atoi.html

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

Но как говорили некоторые комментарии, действительно ли есть узкое место с строковыми манипуляциями? Не можете ли вы избежать их перед рукой?

Ответ 5

Авторы библиотеки Boost Karma провели сравнение нескольких целых чисел с методами преобразования строк здесь. В этот пост Я сделал аналогичное сравнение, но включая формат библиотеки. Для этого вам не нужен специальный строковый класс, например, в случае библиотеки форматов вывод сохраняется во внутреннем буфере, который вы можете преобразовать в std::string или получить как строку C или как массив символов, поэтому при необходимости можно избежать создания строки.

Ответ 6

int castString( const char * str )
{
    int val = 0;
    while( *str ) {
        val = val*10 + (*str++ - '0');
    }
    return val;
}

Это очень быстро