高性能低延迟C ++自定义字符串类

时间:2011-04-04 16:34:14

标签: c++ string

我的目标是找到最快的C ++库,用于将int转换为字符串,反之亦然,以及解析。

任何尝试过C ++性能的人都会很快发现STL的字符串类与STL int算术运算相比具有可怕的性能。

我的3.3 GHz Intel,GCC,CentOS 5.5计算机的一些示例基准测试:

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

您可以快速看到字符串操作将成为任何高速消息传递应用程序的瓶颈。

我找到了其他用于高性能字符串的库(列出),但我写的是希望有人遇到类似的困难并且已经达成了一些解决方案,可能包括编写自己的字符串类。

6 个答案:

答案 0 :(得分:5)

您没有提供有关服务器的大量信息,但请查看AMD和英特尔的这些库:

AMD String Library

Intel Integrated Performance Primitives

两者都使用SSE extensions来加速字符串操作。

据我所知,他们没有 atoi(),但您可以使用这些库来定位输入中的小数。给定字符串的位置和长度,使用SSE内在函数编写转换应该是微不足道的。

答案 1 :(得分:0)

我写了自己的字符串类(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。他们promise“愚蠢地转换”很快。

答案 2 :(得分:0)

以ASCII十六进制发送所有内容,并以汇编语言编写转换例程。

答案 3 :(得分:0)

您可能需要查看http://alexott.blogspot.fr/2010/01/boostspirit2-vs-atoi.html

如果要解析比字符串更复杂的东西,它可能会给你带来更大的性能提升。

但正如一些评论所说,字符串操作真的存在瓶颈吗?你不能在手前避免它们吗?

答案 4 :(得分:0)

Boost Karma库的作者对几种整数到字符串转换方法here进行了比较。在this post我做了类似的比较,但包括format library。您不需要为此设置自定义字符串类,例如,在格式库的情况下,输出存储在内部缓冲区中,您可以将其转换为std::string或作为C字符串或作为字符数组,以便您可以在必要时避免创建字符串。

答案 5 :(得分:0)

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

这是非常快的