MSVC2005 std::_Iterator_base::调试时功能变慢
MSVC2005 std::_Iterator_base:: functions slow while debugging
我在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)
来禁用单个函数/代码块等的优化。如果你只想在一段特定的代码中调试,禁用这段代码的优化可能比全局关闭优化要快得多。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 对可变参数使用声明.如何选择正确的功能
- 询问在设计我的手臂模拟器功能表示格式1
- 构造函数采用 Base&不被调用