【问题标题】:std::map clear() performance in debugger?调试器中的 std::map clear() 性能?
【发布时间】:2010-09-22 11:26:14
【问题描述】:

附加的简单测试程序测试清空简单 std::map 的性能。使用 MSVC 2008 和 2010,从命令提示符执行调试构建将花费不到 30 秒,但从调试器中执行时几乎需要 3 分钟。对 clear() 的调用完全是造成差异的原因。如果我闯入调试器,调用堆栈将始终指向 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;
}

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 是的!就是这样,谢谢。将“_NO_DEBUG_HEAP=1”(带前导下划线)添加到环境变量可以解决问题。我会定期重新启用它进行测试,但是对于常规调试来说,100 倍的速度差异实在是太大了。
    【解决方案2】:

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

    编辑:

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

    【讨论】:

    • 感谢您的回答,但更改并没有产生明显的差异。它也不会解释调试器中的执行与命令行中的执行之间的区别 - 还是会?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多