我一直在努力追踪为什么在调试模式下调试我们的程序需要花费如此长的时间。使用xperf查看堆栈后,很明显我们花费了大量的时间在迭代器和STL容器上。我谷歌了一段时间,并找到了以下选项:
_HAS_ITERATOR_DEBUGGING=0
_SECURE_SCL=0
_SECURE_SCL_THROWS=0
我用#define在代码中设置了所有这些。
#define _HAS_ITERATOR_DEBUGGING 0
#define _SECURE_SCL 0
#define _SECURE_SCL_THROWS 0
但这似乎没有起作用,所以我尝试在Visual Studio项目中使用预处理器定义,但仍然没有帮助。
我已经尝试了几乎所有可能的排列组合,包括在头文件中设置它们和在所有包含之后设置它们,但无论我做什么,在调试时都看不到性能提高。举个例子,在发布模式下,这一系列操作大约需要 140 秒。在调试模式下,需要超过 2,400 秒。处理时间增加了大约 17-18 倍。
一些额外的信息,托管这些 C++ DLL 的进程是一个 C# .net 4 进程,并启用了非托管代码调试。基本上,所有的工作都是在 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
有什么原因导致它如此缓慢吗?