调试器中的std :: map clear()性能?

时间:2010-09-22 11:26:15

标签: c++ visual-studio performance stl debugging

附加的,简单的测试程序测试清空一个简单的std :: map的性能。使用MSVC 2008和2010,从命令提示符执行调试构建将花费<30秒,但在调试器中执行时将花费大约3分钟。对clear()的调用完全是对差异的责任。如果我进入调试器,callstack将始终指向HeapFree 问题:为什么巨大差异?我可以以某种方式更改调试堆设置,以便在调试器中执行时会很快吗?

#include <map>

int
main ( int, char )
{
    std::map< time_t, double > test;
    for ( int i = 0; i < 1000000; ++i )
    {
        test[i] = i / 3.14;
    }
    test.clear();
    return 0;
}

2 个答案:

答案 0 :(得分:5)

尝试在程序的初始环境中设置环境变量_NO_DEBUG_HEAP = 1。这会禁用Windows的内部调试堆,这可能会使调试内存损坏问题变得更加困难。

KB article提到了该标志,如果程序在没有该环境变量的调试器中运行,则可以推断默认(低碎片堆)被禁用。另请参阅此blog post,其中讨论了调试堆如何将程序减慢3-5倍。

答案 1 :(得分:2)

调试器添加了大量迭代器检查以确保安全。您可以使用_HAS_ITERATOR_DEBUGGING=0标志禁用迭代器检查,但我不建议。有关详细信息,请参阅this博客条目。

编辑:

在下面的响应中,如果调试钩子进入应用程序收集信息以评估堆栈或监视代码的调试器中的其他进程,则可能会出现这种情况。我在这里推测是因为我不知道你安装了什么附加组件。但是,从命令行可以使用非调试可执行文件。我自己犯了这个错误,这很容易做到。