CString + =运算符性能问题

时间:2014-03-20 00:19:24

标签: c++ performance mfc cstring

我正在开发一个较旧的MFC / C ++项目,该项目使用MFC的CString类来解析大型文本文件以处理字符串。我注意到在解析过程中,很多小部件都添加到整个大型CString对象中:

//'strContainer' = CString
//'tag' = CString of a much smaller size
strContainer += L"<" + tag + L">";

strContainer变量达到某个更大的大小时,上面的运算符似乎会降低CString的整体性能。我假设发生这种情况是因为+=运营商经常重新分配内存。

所以我很好奇,有没有办法改善这个?

PS1。我不知道预先分配结果字符串的大小。

PS2。由于项目本身的复杂性,我必须坚持使用CString。 (或者,我无法切换到Boost或其他更新的实现。)

1 个答案:

答案 0 :(得分:5)

使用std::string+=通常非常快,因为它只能将字节复制到已分配的缓冲区中。通常,L"<" + tag + L">";将需要三个或更多内存分配,如果您只需用三个+=替换该代码行,则完全没有必要。此外,如果您有Visual Studio为您启动程序,甚至是发布版本,则分配真的非常慢。不使用Visual Studio手动运行程序,看看是否能解决性能问题。

我很好地挖掘了MFC的来源。 (挖了挖,挖了......)发现ATL::CSimpleStringT::PrepareWrite2(int nLength)会成倍增长(每次分配大1.5倍,完全正常,std::string是相同的,除了...... 如果MFC字符串超过1G,则在此之后每个分配仅增加1M。

所以有两个条件: 如果strContainer超过1G,则应手动保留内存(Preallocate大量字节。它不必精确,甚至大于实数。)。br /> 否则,只需将+替换为+=