在 Visual Studio 中发布版本 Ctrl+F5 比从外部 VS 慢 10 倍 [关闭]

Posted

技术标签:

【中文标题】在 Visual Studio 中发布版本 Ctrl+F5 比从外部 VS 慢 10 倍 [关闭]【英文标题】:Release build in Visual Studio Ctrl+F5 10x slower than from outside VS [closed] 【发布时间】:2012-12-12 14:31:41 【问题描述】:

我有一个中型原生 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 而不是应用程序本身运行,并将其与 VS 外部可用的 PATH 进行比较。没有区别。 在 exe 上运行 DependencyWalker,并将其与运行应用程序时加载的 Visual Studio 列出的库进行比较。没有区别。 谷歌搜索和搜索,但这只是提出了上述想法或处理了 F5 与 Ctrl+F5 的差异(在我的情况下没有)。

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

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

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

编辑

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

编辑 2

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

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

【问题讨论】:

标准答案:使用分析器。 【参考方案1】:

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

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

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

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

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

    Low-fragmentation Heap HeapSetInformation function

论坛上有一个类似的帖子:Why does my STL code run so slowly when I have the debugger/IDE attached?

【讨论】:

你真的拯救了我的一天!由于未知原因,VS2012 决定在 Release 中也启用调试堆的使用。使用 _NO_DEBUG_HEAP=1 启动后,它似乎恢复了正确的配置。该死的VS2012!

以上是关于在 Visual Studio 中发布版本 Ctrl+F5 比从外部 VS 慢 10 倍 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 快捷键

Visual Studio Code

Visual Studio 2015 添加发布版本号

在 Visual Studio 中增加构建版本号

如何对 Visual Studio 工件进行版本控制?

visual studio 2013 中更改C#项目的 Framework 版本