在Visual Studio中使用Ctrl+F5进行发布构建比在VS外部运行慢10倍

8
我有一个中等规模的本地 C++ 应用程序。当我在 Visual Studio (2008) 中运行它时,它的运行速度比从 Visual Studio 外部运行大约慢 10 倍。这适用于调试和发布版本,无论我是通过“开始调试”(F5)还是“不带调试启动”(Ctrl+F5)来运行应用程序。
换句话说: 在 Visual Studio 中运行 Release 版本 没有 调试器时,比从命令提示符(或从 Windows Explorer)运行相同的可执行文件慢 10 倍。
我尝试过的事情:
  • 仔细检查是否设置了断点、跟踪点、异常调试等。没有任何问题。
  • 为应用程序在 VS 调试属性中设置 _NO_DEBUG_HEAP=1。没有效果。
  • cmd /c set PATH 设置为由 Ctrl+F5 运行而不是应用程序本身,并将其与 VS 外部可用的 PATH 进行比较。没有区别。
  • 在 exe 上运行 DependencyWalker 并将其与 Visual Studio 在运行应用程序时列出的库进行比较。没有区别。
  • 谷歌和搜索 SO,但这只涉及到上述想法或处理 F5 vs. Ctrl+F5 的差异(在我的情况下没有差异)。
我已经没有想法了,非常感谢任何指导或建议。
该应用程序使用 OpenGL 和 Qt,并执行相当普通的操作: 仅在启动时进行文件输入(3D 模型和着色器),没有文件输出,很少使用第三方库(除了 Qt 外,所有库都链接静态)。
更让人沮丧的是,在最近对应用程序进行内部重构之后,我才开始遇到这种行为。在此之前,它在 VS 内外都运行良好。这次重构主要涉及将一些功能提取到新创建的基类中(即,将 A > B 继承改为 A > C > B 继承,只涉及很少的虚拟调用),并将一些 new[] 调用替换为 std::vector
我找到原因了:这是一个关于工作目录的奇怪依赖。如果从.vcproj所在的目录启动(这是VS通常使用F5和Ctrl + F5进行的),目录中的相对路径将存在,并且调试输出(我已经忘记了其存在)将成功,减慢运行速度。从任何其他目录执行都会导致输出失败,从而导致更快的执行速度。
对于所有花费时间的人,我深表歉意。投票关闭。

1
标准答案:使用性能分析器。 - Hans Passant
1个回答

3
根据我的经验,这与低碎片堆有关。但你说你已经设置了 _NO_DEBUG_HEAP=1,所以我不知道这是否是正确的答案,我认为你至少可以尝试一下。
启用低碎片堆(LFH)有助于减少堆碎片,如果应用程序使用大量内存分配,则启用后可以提高应用程序的性能,速度提高10倍。
从Windows Vista开始,默认情况下启用LFH,但是当进程在任何调试器下运行时,某些堆调试选项会自动启用进程中所有堆的调试选项。这些堆调试选项会阻止使用LFH。
这就解释了为什么从VS启动应用程序会慢10倍。(我过去也遇到过同样的问题)。您可以使用函数HeapQueryInformation获取堆信息并将其输出以验证是否由于禁用了LFH。
有关LFH的详细信息,请参阅以下两篇文章:
  1. 低碎片堆
  2. HeapSetInformation 函数

论坛上有一个类似的帖子:为什么我的STL代码在调试器/IDE下运行得如此缓慢?


1
你真的救了我的一天!由于未知原因,VS2012决定在Release模式下启用调试堆。在使用_NO_DEBUG_HEAP=1进行启动后,它似乎已经恢复了正确的配置。该死的VS2012! - Nicola Pezzotti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接