高性能低延迟C++;自定义字符串类 我的目标是找到最快的C++库,用于将int转换为String,反之亦然,并进行解析。< /P> 任何人都已经尝试过C++的性能,很快就会发现,与STL int算术运算相比,String类的性能非常差。
来自我的3.3 GHz Intel、GCC、5.5机器的一些示例基准测试:高性能低延迟C++;自定义字符串类 我的目标是找到最快的C++库,用于将int转换为String,反之亦然,并进行解析。< /P> 任何人都已经尝试过C++的性能,很快就会发现,与STL int算术运算相比,String类的性能非常差。,c++,string,C++,String,来自我的3.3 GHz Intel、GCC、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 (c
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
您很快就会发现字符串操作将成为任何高速消息传递应用程序的瓶颈
我已经找到了其他用于高性能字符串的lib(已列出),但我希望有人也有类似的困难,并找到了一些解决方案,可能包括编写自己的字符串类
据我所知,它们没有atoi(),但是您可以使用这些库来定位输入中的小数。给定字符串的位置和长度,使用SSE intrinsic编写转换应该很简单。我编写了自己的字符串类()。它只是一个标题,允许我重用堆栈缓冲区并轻松包装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;
还有,但我不太清楚它在64位平台上的行为。还有。他们认为“folly::to”转换很快。用ASCII十六进制发送所有内容,并用汇编语言编写转换例程。您可能想看看 如果您正在解析比字符串更复杂的内容,那么它可能会给您带来更大的性能提升
但正如一些评论所说,字符串操作真的存在瓶颈吗?你能不能先避开它们?Boost Karma library的作者对几种整数到字符串的转换方法进行了比较。在年,我做了一个类似的比较,但包括了。您不需要为此自定义字符串类,例如,对于格式库,输出存储在内部缓冲区中,您可以将其转换为
std::string
,或作为C字符串或字符数组访问,以便在必要时避免创建字符串
int castString( const char * str )
{
int val = 0;
while( *str ) {
val = val*10 + (*str++ - '0');
}
return val;
}
这非常快好吧,你已经完成了基准测试。但我的问题是:优化这个类真的重要吗?在实际字符串数字转换中是否花费了大量时间(>20%的时间)?还有,为什么还要麻烦以字符串形式发送数字数据呢?更有效的方法是简单地以其本机(或中间,但仍然是数字)表示形式发送它们。您是否有一个应用程序,您已经分析并确定了瓶颈处理字符串,或者你只是猜测它可能是某个假设应用程序中的瓶颈?我想你会发现这并不是真正的瓶颈。网络延迟将使这些时间模糊几个数量级。mike bantegui,以二进制发送会更快,但这不是此特定应用程序的选项,因为接收应用程序必须接收字符数组。克里斯·卡德,是的,这是个瓶颈。martin,是的,网络延迟会掩盖这些时间,但网络延迟并不决定你能以多快的速度生成响应,这正是我所优化的。bo persson,是的,我的目标是消息处理率为每年数百万second@peekay:然后简单地以字符数组的形式发送数据。在C++中,您可以将其转换为指向char的指针,然后发送数据。接收端将接收字符数组,您可以将其转换回数字类型。并且完全没有任何错误检查!你是一个多么值得信赖的人啊。此外,它不处理带符号的输入,因此可能会返回unsigned int。