我有一个问题,在网上无法找到答案...
这是我声明的一组:
set<unsigned int> MySet
我正在插入用mersenne twister生成的一百万个随机数。随机生成和插入非常快(大约一秒钟完成一百万个数字),但释放内存却极其缓慢(需要1分30秒)。
为什么释放内存如此缓慢?我没有使用任何自定义析构函数来清除这个集合。
我有一个问题,在网上无法找到答案...
这是我声明的一组:
set<unsigned int> MySet
请以发布模式编译您的代码。
这样做有两个好处。
请注意,此信息适用于DevStudio。
可能是因为优化分配而牺牲回收更加明智,因为许多应用程序分配而不释放,但从来没有相反的情况。我自己也看到了类似的模式,在一个混合调用malloc
和free
的应用程序中(与一次性分配和释放不同)。
我从未编写过堆分配器,所以我不知道是否有比这个更深层的技术原因。在回收时,必须找到相邻的空闲块并将它们合并。所以这项工作本质上是不同的。
对于1百万个小型free()
需要90秒听起来非常慢。我从未真正编写过Windows代码,因此无法确定是否异常,但系统应该能够做得更好。
您的问题的解决方案可能很简单,即在程序退出之前跳过释放对象。您可以尝试从std::allocator< unsigned int >
派生一个自定义分配器,使deallocate
成为无操作。