我有一个中型本机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
。没效果。cmd /c set PATH
设置为由Ctrl + F5而不是应用程序本身运行,并将其与VS外部可用的PATH
进行比较。没有区别。我的想法已经用完了,如果想看哪里或尝试什么,我会感激不尽。
该应用程序使用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)启动,则目录中的相对路径将存在,并且调试输出(我忘记了它的存在)成功,从而减慢了运行速度。从任何其他目录执行使输出失败,从而加快执行速度。
我向所有花时间在这上面的人道歉。投票结束。
答案 0 :(得分:3)
根据我的经验,它与Low-fragmentation Heap有关。但是你说你已经设置了_NO_DEBUG_HEAP = 1,所以我不知道这是不是正确答案,我认为你至少可以尝试一下。
低碎片堆(LFH)有助于减少堆碎片,启用后,如果您的应用程序使用大量内存分配,它可以以10倍的速度提升应用程序的性能。
从Windows Vista开始默认启用LFH,但是,LFH被禁用当在任何调试器下运行进程时,会自动为进程中的所有堆启用某些堆调试选项。这些堆调试选项阻止使用LFH。
这解释了为什么如果从VS启动应用程序运行速度慢10倍。(我在过去遇到了同样的问题)。您可以使用函数HeapQueryInformation来获取堆信息并输出它以验证它是否是由LFH禁用引起的。
有关LFH的详细信息,请参阅以下两篇文章: