繁体   English   中英

MSVC2005 std :: _ Iterator_base ::调试时功能变慢

[英]MSVC2005 std::_Iterator_base:: functions slow while debugging

我正在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秒钟以上,我在这里缺少什么吗?

更新:在类方法周围包装/D _HAS_ITERATOR_DEBUGGING=0 #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调试版本运行得更快

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

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM