【问题标题】:MSVC2005 std::_Iterator_base:: functions slow while debuggingMSVC2005 std::_Iterator_base:: 调试时运行缓慢
【发布时间】:2011-08-31 04:12:30
【问题描述】:

我正在分析 MSVC 2005 中的调试构建 c++ 代码,与发布时(1-2 秒)相比,某些代码需要很长时间才能执行(30 多秒)。

我已在编译器选项 (/D _SECURE_SCL=0) 中将 _SECURE_SCL 设置为 0,并在源代码中验证其设置为零。

我从分析器 (AMD CodeAnalyst) 中复制了顶级消费者

  • std::_Iterator_base::_Orphan_me 19.74
  • std::_Iterator_base::_Adopt 9.57
  • std::_Iterator_base::operator= 8.98
  • std::_Iterator_base::~_Iterator_base 8.55
  • std::_Iterator_base::_Iterator_base 7.37

尝试调试代码并且每次都不得不等待 30 多秒,这有点糟糕,我这里有什么遗漏吗?

更新:#pragma optimize() 包裹在类方法周围并没有太大作用,但定义 /D _HAS_ITERATOR_DEBUGGING=0 会降低发布速度,这些现在是我的顶级分析器命中(这对于函数来说似乎很正常):

  • std::_Vector_const_iterator >::operator++ 29.79
  • std::_Vector_const_iterator >::operator++ 26.26
  • std::_Vector_const_iterator >::operator* 25.74

3 个函数,60 条指令,总计:2666 个样本,显示样本的 81.78%,会话样本总数的 2.76%

感谢您的快速回复!

【问题讨论】:

    标签: c++ visual-c++ profiling


    【解决方案1】:

    如果您关心调试性能,还应该禁用 _HAS_ITERATOR_DEBUGGING。启用迭代器调试后,系统会进行大量记录以帮助您检测代码中使用无效迭代器或未能正确管理容器和迭代器生命周期的错误。

    也就是说,经过检查的调试构建和优化的发布构建之间 30:1 的性能差异听起来非常典型和合理。

    【讨论】:

    • 由于您使用的是旧版本的 Visual C++,请注意禁用迭代器调试在旧版本中相当有问题(例如,ostringstream is broken)。大多数这些错误在 VS2008 或 VS2010 中已修复(嗯,影响我编写的代码的有害错误已修复)。
    【解决方案2】:

    在这里查看一些答案:How to make MSVC debug builds run faster

    除了@James 提到的_HAS_ITERATOR_DEBUGGING = 0,似乎还有一个巧妙的技巧可以切换#pragma optimize("", off) / #pragma optimize("", on) 以禁用对单个函数/代码块等的优化。如果您只想在特定的一段代码中进行调试,仅禁用该部分的优化可能比全局关闭优化要快得多。

    希望这会有所帮助。

    【讨论】:

    • 我会在以后使用时记住这一点,但这次似乎对我的情况没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    相关资源
    最近更新 更多