调试时MSVC2005 std :: _ Iterator_base :: functions运行缓慢

时间:2011-08-31 04:12:30

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

我在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 :: _采用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%的总会话样本

感谢您的快速回复!

2 个答案:

答案 0 :(得分:4)

如果您关心调试性能,还应该禁用_HAS_ITERATOR_DEBUGGING。启用迭代器调试后,会执行大量的簿记来帮助您检测代码中使用无效迭代器的错误,或者无法正确管理容器和迭代器生存期。

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

答案 1 :(得分:0)

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

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

希望这有帮助。