c++ - 在 Visual Studio Ctrl+F5 中发布版本比从外部 VS 慢 10 倍

标签 c++ visual-studio visual-studio-2008

很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center .




8年前关闭。




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

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

我尝试过的事情:

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

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

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

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

    编辑

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

    编辑 2

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

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

    最佳答案

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

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

    从 Windows Vista 开始默认启用 LFH,但是,禁用 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?

    关于c++ - 在 Visual Studio Ctrl+F5 中发布版本比从外部 VS 慢 10 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13841902/

    相关文章:

    C++ - 从/dev/urandom 中提取随机数

    c++ - printf/scanf的用法以及与<iostream>和cout/cin差异的区别,什么时候使用?

    c# - 如果创建出错,删除数据库

    c++ - 在 Win 7 Hyper V 上调试,获取 "0xC0000096 Privileged instruction"异常的多个实例

    c++ - 程序在 Debug 构建中运行良好,但在 Release 构建中失败

    c++ - 无法编译C++程序

    c++ - 是否可以传递具有捕获的不可复制(移动)值的 lambda?

    visual-studio - 将外部 header 添加到 Visual Studio 项目

    asp.net-mvc - 如何在ASP.NET MVC6 beta5项目中添加 Controller ?

    c# - 将远程调试器附加到几乎立即崩溃的进程