Высокий уровень производительности с низкой задержкой С++
Моя цель - найти самую быструю библиотеку С++ для кастования 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;
}
Это очень быстро