CString +=运算符性能问题

CString += operator performance issues

本文关键字:性能 问题 运算符 CString      更新时间:2023-10-16

我正在研究一个旧的MFC/c++项目,该项目使用MFC的CString类来处理字符串来解析大型文本文件。我注意到,在解析过程中,有很多小部分添加到整个大型CString对象中,例如:

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

上面的操作符似乎在strContainer变量达到一定较大的大小时减慢了CString的整体性能。我假设发生这种情况是因为+=操作符经常重新分配内存。

所以我很好奇,有什么方法可以改善这一点吗?

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

PS2。由于项目本身的复杂性,我不得不坚持使用CString。(或者,我不能切换到Boost或其他较新的实现)

对于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)大量字节。它不必是精确的,甚至不必大于实际数字。
否则,只需将+替换为+=