CString +=运算符性能问题
CString += operator performance issues
我正在研究一个旧的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
)大量字节。它不必是精确的,甚至不必大于实际数字。
否则,只需将+
替换为+=
。
相关文章:
- 在类中使用随机生成器时出现性能问题
- Qt OpenGL 渲染到纹理性能问题
- 剪辑性能问题
- OpenCV - 基本操作 - 性能问题 [模式:发布]
- 使用 #define 进行跟踪日志记录以避免性能问题
- 在 Qt C++ 中在自定义项委托上绘制文本时的性能问题
- std::函数有性能问题,如何避免?
- 使用 const double* const 作为模板参数 - 代码性能问题
- 在C 中读取大型CSV文件性能问题
- MPI 二进制文件 I/O 基本功能和性能问题
- 使用STD :: MAP在数据及其性能问题中查找重复项.我可以预先分配吗?
- C 功能性能问题
- 在C 性能问题中使用Getter返回地图
- 初始化每个班级成员时的性能问题
- 事件(开始,结束),1天的最大事件.C++ 中的性能问题
- 在X64模式下从C /CLI调用MASM PROC会产生意外的性能问题
- OpenGL:MESA3D屏幕上的软件渲染性能问题
- 是包含容器性能问题的STL关联容器
- 任何性能问题都在qt框架中使用了stackedwidget的最大页面数
- SHGetFileInfo性能问题