我正在开发一个较旧的MFC / C ++项目,该项目使用MFC的CString类来解析大型文本文件以处理字符串。我注意到在解析过程中,很多小部件都添加到整个大型CString对象中:
//'strContainer' = CString
//'tag' = CString of a much smaller size
strContainer += L"<" + tag + L">";
当strContainer
变量达到某个更大的大小时,上面的运算符似乎会降低CString的整体性能。我假设发生这种情况是因为+=
运营商经常重新分配内存。
所以我很好奇,有没有办法改善这个?
PS1。我不知道预先分配结果字符串的大小。
PS2。由于项目本身的复杂性,我必须坚持使用CString。 (或者,我无法切换到Boost或其他更新的实现。)
答案 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 />
否则,只需将+
替换为+=
。