我正在尝试优化我编写的一些代码来处理应用程序协议的多个层。我自由地使用了std::string
类,并且为了简单而不是过早优化而努力。应用程序太慢了, valgrind & gprof 显示我正在花费大量时间复制构造字符串,因为缓冲区在我的堆栈中向上移动。
在我看来,在将chars从系统缓冲区复制到最低的应用程序缓冲区之后,我应该能够避免再次复制数据了:毕竟,它在向上移动堆栈时不会发生变异。
我的协议格式是一种“传输”,由一个或多个以换行符终止的记录组成,每个记录由多个以制表符分隔的字段组成,并以特殊字符结尾令牌。 E.g。
RECORD 1\tHAS\tTHESE\tFIELDS\nRECORD 2\tLOOKS\tLIKE\tTHIS\nEND-OF-TRANSMISSION\n
这将汇集在一个名为input_buffer的std::string
中。
传输处理涉及从缓冲区中提取记录并将其传递到下一层;从记录中提取 fields 的向量并将其传递给下一层;将字段存储到地图中。在每个阶段,正在分配新的std :: strings时复制数据。
是否可以将索引中的const字符串分配到input_buffer中,并且长度为...而不进行任何复制?例如,RECORD 2从偏移26开始,长度为24个字符:
const std:string record (substr(input_buffer, 26), 24 );
我不熟悉字符串对象的内部,但它的性能保证似乎暗示某处有一个简单的char序列,而且几乎无疑是指向那些字符内存的指针。该指针可以初始化为属于另一个字符串的内存吗?
(我的编译器是g ++ 4.7,但如果这是需要4.8的东西,我也很高兴知道这一点。)
答案 0 :(得分:1)
据我了解,这听起来像boost::string_ref的好候选人。
您只需执行boost::string_ref input(input_buffer);
,然后将string_ref
传递给堆栈。你唯一需要担心的是保持原始缓冲区的存活时间。