MSVC2005 std::_Iterator_base::调试时功能变慢

MSVC2005 std::_Iterator_base:: functions slow while debugging

本文关键字:功能 base std Iterator MSVC2005 调试      更新时间:2023-10-16

我在MSVC 2005中分析调试构建c++代码,与版本(1-2秒)相比,某些代码执行时间非常长(30多秒)。

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

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

  • std:: _Iterator_base:: _Orphan_me 19.74
  • std:: _Iterator_base:: _Adopt 9.57
  • std:: _Iterator_base::操作符= 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%

感谢您的快速回复!

如果你关心调试性能,你也应该禁用_HAS_ITERATOR_DEBUGGING。当启用了迭代器调试时,会做大量的记录来帮助您检测代码中的错误,例如您使用了无效的迭代器或未能正确管理容器和迭代器的生命周期。

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

看看这里的一些答案:如何使MSVC调试构建运行得更快

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