C++字符串内存管理

Dan*_*röm 12 c++ mfc memory-management

上周我在C#中写了几行代码,将一个大文本文件(300,000行)激活到一个Dictionary中.编写花了十分钟,并在不到一秒的时间内执行.

现在我将这段代码转换为C++(因为我需要在旧的C++ COM对象中).到目前为止,我已经花了两天时间.:-(虽然生产力差异本身令人震惊,但这是我需要一些建议的表现.

加载需要7秒钟,甚至更糟糕的是:之后需要花费很多时间来释放所有CStringW.这是不可接受的,我必须找到一种方法来提高性能.

有没有机会我可以分配这么多字符串而不会看到这种可怕的性能退化?

我现在的猜测是,我必须将所有文本填充到一个大型数组中,然后让我的哈希表指向此数组中每个字符串的开头并删除CStringW内容.

但在那之前,你有C++专家的建议吗?

编辑:我给自己的答案如下.我意识到这对我来说是最快的路径,也是认为正确的方向 - 更多托管代码.

Ton*_*Lee 12

这听起来非常像Raymond Chen和Rico Mariani的C++ vs C#中文/英文字典表演.雷蒙德用了几次迭代来击败C#.

也许那里的想法会有所帮助.

http://blogs.msdn.com/ricom/archive/2005/05/10/performance-quiz-6-chinese-english-dictionary-reader.aspx


Han*_*ant 11

你正踩着Raymond Chen的鞋子.他做了完全相同的事情,用非托管C++编写中文字典.Rico Mariani也做了,用C#编写.玛丽安先生制作了一个版本.陈先生写了6个版本,试图匹配Mariani版本的性能.他几乎重写了C/C++运行时库的重要部分来实现目标.

之后,托管代码得到了更多的尊重.GC分配器是不可能击败的.查看此博客文章以获取链接.这篇博文也可能对您感兴趣,有助于了解STL值语义是如何成为问题的一部分.


Tim*_*Tim 10

让人惊讶.摆脱CStrings ......

尝试一个探查器.你确定你不只是运行调试代码吗?

请改用std :: string.

编辑:

我只是对ctor和dtor比较做了一个简单的测试.

CStringW似乎需要2到3倍的时间来执行新的/删除.

迭代1000000次为每种类型做新/删除.没有别的 - 和每个循环之前和之后的GetTickCount()调用.CStringW一直使用两倍的时间.

虽然我怀疑,这并没有解决你的整个问题.

编辑:我也不认为使用字符串或CStringW是真正的问题 - 还有其他事情导致你的问题.

(但是为了上帝的缘故,无论如何都要使用stl!)

你需要对它进行分析.那是一场灾难.