为什么释放缓慢?

时间:2011-11-25 04:50:22

标签: c++ memory-management set

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

我有一个声明如下:

set<unsigned int> MySet

我正在插入由mersenne twister生成的一百万个随机数。随机生成和插入非常快(大约一百万个数字),但释放速度非常慢(1分半钟)。

为什么解除分配这么慢?我没有使用任何自定义析构函数。

2 个答案:

答案 0 :(得分:7)

在发布模式下编译代码。

这有两件事。

  1. 它启用了绝对有帮助的优化。
  2. 内存管理库对于调试和发布也是不同的 构建库的调试版本以允许调试并且它们维护额外的信息(例如标记解除分配的内存)。所有这些额外的处理确实需要花费
    • 两个版本的库的目标完全不同。发布版本绝对针对速度进行了优化,调试版本针对恢复和调试进行了优化。
  3. 请注意,此信息与DevStudio有关。

答案 1 :(得分:1)

可能因为以牺牲释放为代价来优化分配更有意义,因为许多应用程序在没有解除分配的情况下进行分配,但反之亦然。我自己在一个混合调用mallocfree的应用程序中看到了类似的模式(而不是同时分配和释放所有内容)。

我从来没有写过堆分配器,所以我不知道是否有更深层次的技术原因。解除分配时,必须找到并合并相邻的自由块。所以这项工作从根本上说是不同的。

100万小free()的声音非常慢,90秒。我从来没有真正编写Windows,所以我不能说这是不正常的,但系统应该能够做得更好。

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