Zip*_*per 5 c++ debugging visual-studio-2010 visual-studio-debugging
我一直在努力追查为什么在调试模式下调试我们的程序需要这么长时间.在使用xperf查看堆栈的外观后,显然我们在迭代器和STL容器中花费了大量的时间.我用谷歌搜索了一段时间,找到了选项
_HAS_ITERATOR_DEBUGGING=0
_SECURE_SCL=0
_SECURE_SCL_THROWS=0
Run Code Online (Sandbox Code Playgroud)
我用#define在代码中设置了所有这些
#define _HAS_ITERATOR_DEBUGGING 0
#define _SECURE_SCL 0
#define _SECURE_SCL_THROWS 0
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用,所以我尝试使用visual studio项目中的预处理器定义,但这似乎仍然没有帮助.
我已经尝试了几乎所有我能想到的排列,包括在标题中设置它们,以及所有包含之后,但无论我做什么,我都没有看到调试时性能提升.举个例子,当在发布模式下运行时,这一系列操作大约需要140秒.在调试模式下,它需要超过2,400秒.加工时间大约增加17-18倍.
一些额外的信息,托管这些C++ DLL的进程是一个C#.net 4进程,我启用了非托管代码调试.基本上所有进程都会为我们加载DLL.所有实际工作都是在c ++代码中完成的.
我在下面包含了完整的编译器命令行.
/I"..\CommonInclude" /Zi /nologo /W4 /WX /Od /Oy- /D "_CRT_SECURE_NO_WARNINGS" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" /D "ENGINE_EXPORTS" /D "_HAS_ITERATOR_DEBUGGING=0" /D "_SECURE_SCL=0" /D "_SECURE_SCL_THROWS=0" /D "_VC80_UPGRADE=0x0710" /D "_WINDLL" /D "_MBCS" /Gm- /EHa /MDd /GS /fp:precise /Zc:wchar_t- /Zc:forScope /GR /Yu"StdAfx.h" /Fp".\Debug/Foo.pch" /Fa".\Debug/" /Fo".\Debug/" /Fd".\Debug/" /Gd /analyze- /errorReport:queue /EHa -Zm350 /MP3
Run Code Online (Sandbox Code Playgroud)
任何想法为什么会这么慢?
根据您的描述,这会立即跳出:
我一直在努力追查为什么在调试模式下调试我们的程序需要这么长时间.在使用xperf查看堆栈的外观后,显然我们在迭代器和STL容器中花费了大量的时间.
如果您使用基于节点的容器(如map,set,unordered_map,unordered_set,multimap,multiset,list,等),并从调试器中运行,你可能会遇到从这些容器分配一吨的小尺寸物体的干的问题.当您从Windows中的调试器运行应用程序时,操作系统会将进程堆切换到调试堆.如果在加载时有许多基于节点的容器,释放它们将占用调试堆的大量时间.
一个简单的解决方法是通过将以下内容添加到调试选项的Environment部分来禁用调试堆: _NO_DEBUG_HEAP=1
这会禁用调试堆.
造成巨大差异的一件事是,默认情况下函数不会在调试模式下内联。这会增加使用许多小型访问器函数进行编码的大量时间。
我的程序中,调试模式和发布模式之间的差异是 100+,而不依赖于迭代器。
| 归档时间: |
|
| 查看次数: |
2918 次 |
| 最近记录: |