2012-12-12 81 views
8

我有一个中等大小的本地C++应用程序。当我从Visual Studio(2008)中运行它时,它的运行速度比从Visual Studio外运行时慢大约10倍。这适用于调试和发布版本,并且当我运行应用程序时,发生这两种情况,分别为Start Debugging(F5)和Start Without Debugging(Ctrl + F5)。在Visual Studio中发布版本Ctrl + F5比从外部版本慢10倍VS

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

事情我想:

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

我已经用尽了想法,我会很感激任何指向哪里看或尝试什么。

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

为了增加对受伤的侮辱,我只在最近内部重构应用程序后才开始体验这种行为。在此之前,它在VS和VS之间运行良好。这种重构主要涉及到将一些功能提取到新创建的基类中(即,将A > B继承改为A > C > B继承,涉及极少虚拟调用)并用std::vector替换几个new[]调用。

编辑

我想一两件事:在应用程序的调试性能,设定目标为cmd /k,然后做Ctrl + F5键启动cmd,并运行基于命令行的应用程序。这样,它以正常速度运行(即10倍减速不存在)。当然,这对于调试是无用的,但我想从完整性的角度来提及它。

EDIT 2

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

我对所有在此花费时间的人表示歉意。投票结束。

+1

标准答案:使用一个分析器。 –

回答

3

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

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

LFH默认情况下,从Windows Vista开始启用,然而,当一个进程被任何调试器下运行LFH被禁用,某些堆调试选项将自动为进程中的所有堆启用。这些堆调试选项阻止使用LFH。

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

对于LFH的详情,请参阅这两篇文章:

  1. Low-fragmentation Heap
  2. HeapSetInformation function

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

+1

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

相关问题