8

我有一个中型原生 C++ 应用程序。当我从 Visual Studio (2008) 中运行它时,它的运行速度比从 Visual Studio 外部运行时慢大约 10 倍。这适用于 Debug 和 Release 版本,并且在我以Start Debugging(F5) 和Start Without Debugging(Ctrl+F5) 运行应用程序时都会发生。

换句话说:在没有调试器的情况下在 Visual Studio 中运行发布版本比从命令提示符(或 Windows 资源管理器)运行相同的可执行文件慢 10 倍。

我尝试过的事情:

  • 仔细检查没有设置断点、跟踪点、异常调试等。没有。
  • 在应用程序的 VS 调试属性中设置_NO_DEBUG_HEAP=1。没有效果。
  • 设置cmd /c set PATH为由 Ctrl+F5 而不是应用程序本身运行,并将其与PATHVS 外部可用的情况进行比较。没有不同。
  • 在 exe 上运行 DependencyWalker,并将其与运行应用程序时加载的 Visual Studio 列出的库进行比较。没有不同。
  • 谷歌搜索和搜索,但这只是提出了上述想法或处理了 F5 与 Ctrl+F5 的差异(在我的情况下没有)。

我已经没有想法了,如果有任何关于在哪里寻找或尝试什么的指示,我将不胜感激。

该应用程序使用 OpenGL 和 Qt,并且做相当普通的事情:没有加载/卸载 DLL,仅在启动时输入文件(3D 模型和着色器),没有文件输出,很少的第 3 方库(除了 Qt,所有这些都是静态链接的) .

雪上加霜,我只是在最近对应用程序进行内部重构后才开始遇到这种行为。在此之前,它在 VS 内外都运行良好。这次重构主要是把一些功能提取到一个新创建的基类中(即把A > B继承改成A > C > B继承,涉及的虚调用很少),并new[]用 s 替换了一些调用std::vector

编辑

我又尝试了一件事:在应用程序的调试属性中,将目标设置为cmd /k,然后执行 Ctrl+F5 以启动cmd并从该命令行运行应用程序。这样,它以正常速度运行(即不存在 10 倍减速)。当然,这对于调试毫无用处,但出于完整性的考虑,我想提一下。

编辑 2

我找到了:这是对工作目录的奇怪依赖。如果从 .vcproj 所在的目录开始(VS 通常使用 F5 和 Ctrl+F5),目录中的相对路径将存在,并且调试输出(我忘记了它的存在)成功,从而减慢了运行速度。从任何其他目录执行会导致输出失败,从而加快执行速度。

我向所有为此花费时间的人道歉。投票结束。

4

1 回答 1

3

根据我的经验,它与低碎片堆有关。但是你说你设置了_NO_DEBUG_HEAP=1,所以我不知道这是否是正确的答案,我想你至少可以试一试。

低碎片堆 (LFH) 有助于减少堆碎片,启用后,如果您的应用程序使用大量内存分配,它可以提高应用程序的性能,速度提高 10 倍。

从 Windows Vista 开始默认启用 LFH,但是,当进程在任何调试器下运行时,会自动为进程中的所有堆启用某些堆调试选项。这些堆调试选项阻止使用 LFH。

这解释了为什么如果从 VS 启动应用程序运行速度会慢 10 倍。(我过去遇到过同样的问题)。您可以使用函数HeapQueryInformation来获取堆信息并输出它来验证是否是由禁用 LFH 引起的。

有关 LFH 的详细信息,请参阅以下两篇文章:

  1. 低碎片堆
  2. HeapSetInformation 函数

论坛上有一篇类似的帖子:为什么我连接了调试器/IDE 后我的 STL 代码运行如此缓慢?

于 2012-12-13T04:41:08.703 回答