为什么释放内存速度慢?

6

我有一个问题,在网上无法找到答案...

这是我声明的一组:

set<unsigned int> MySet

我正在插入用mersenne twister生成的一百万个随机数。随机生成和插入非常快(大约一秒钟完成一百万个数字),但释放内存却极其缓慢(需要1分30秒)。
为什么释放内存如此缓慢?我没有使用任何自定义析构函数来清除这个集合。

我不知道你使用的操作系统是什么,但每个块被释放后,内存可能会被重新压缩。 - Steve Wellens
2
你是否开启了优化编译选项?-O3 - Martin York
无法在g++或VS2010中重现您的问题 http://codepad.org/KQj7Yfq4 - twsaef
3
请在发布模式下进行构建(这将开启大多数功能),然后重新计时。 - Martin York
2
@SeeBeen:新时间是多少? - Martin York
显示剩余6条评论
2个回答

7

请以发布模式编译您的代码。

这样做有两个好处。

  1. 它会打开优化功能,这肯定会有所帮助。
  2. 此外,调试和发布时的内存管理库是不同的。
    调试版本的库是为了方便调试而构建的,它们保留额外的信息(例如标记已释放的内存)。所有这些额外的处理实际上都是有成本的。
    • 两个版本库的目标完全不同。发布版肯定是针对速度进行优化的,而调试版则优化了恢复和调试。

请注意,此信息适用于DevStudio。


1

可能是因为优化分配而牺牲回收更加明智,因为许多应用程序分配而不释放,但从来没有相反的情况。我自己也看到了类似的模式,在一个混合调用mallocfree的应用程序中(与一次性分配和释放不同)。

我从未编写过堆分配器,所以我不知道是否有比这个更深层的技术原因。在回收时,必须找到相邻的空闲块并将它们合并。所以这项工作本质上是不同的。

对于1百万个小型free()需要90秒听起来非常慢。我从未真正编写过Windows代码,因此无法确定是否异常,但系统应该能够做得更好。

您的问题的解决方案可能很简单,即在程序退出之前跳过释放对象。您可以尝试从std::allocator< unsigned int >派生一个自定义分配器,使deallocate成为无操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接