Visual Studio Ctrl + F5中的发布版本比外部VS慢10倍

时间:2012-12-12 14:31:42

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

我有一个中型本机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列表进行比较。没有区别。
  • 谷歌搜索和搜索SO,但这只是提出了上述想法或处理F5与Ctrl + F5差异(在我的情况下没有)。

我的想法已经用完了,如果想看哪里或尝试什么,我会感激不尽。

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

为了增加对伤害的侮辱,我在最近内部重构应用程序后才开始体验这种行为。在此之前,它在内部和后面都运行良好。这种重构主要涉及将一些功能提取到新创建的基类中(即,将A > B继承更改为A > C > B继承,涉及的虚拟调用非常少)并使用{替换一些new[]调用{1}}秒。

修改

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

编辑2

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

我向所有花时间在这上面的人道歉。投票结束。

1 个答案:

答案 0 :(得分:3)

根据我的经验,它与Low-fragmentation Heap有关。但是你说你已经设置了_NO_DEBUG_HEAP = 1,所以我不知道这是不是正确答案,我认为你至少可以尝试一下。

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

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

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

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

  1. Low-fragmentation Heap
  2. HeapSetInformation function
  3. 论坛上有一篇类似的帖子:Why does my STL code run so slowly when I have the debugger/IDE attached?