Rei*_*ica 8 c++ visual-studio-2008 visual-studio
我有一个中型本机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而不是应用程序本身运行,并将其与PATHVS 的可用外部进行比较.没有不同.我已经没有想法,我会很感激任何关于在哪里寻找或尝试什么的指示.
该应用程序使用OpenGL和Qt,并做相当普通的事情:没有加载/卸载DLL,仅在启动时的文件输入(3D模型和着色器),没有文件输出,很少第三方库(除了Qt,所有都是静态链接) .
为了增加对伤害的侮辱,我在最近内部重构应用程序后才开始体验这种行为.在此之前,它在内部和后面都运行良好.这种重构主要涉及将一些功能提取到新创建的基类中(即,将A > B继承更改为A > C > B继承,涉及的虚拟调用很少)并用s 替换一些new[]调用std::vector.
编辑
我还尝试了一件事:在应用程序的调试属性中,将目标设置为cmd /k,然后执行Ctrl + F5以cmd从该命令行启动并运行应用程序.这样,它以正常速度运行(即10x减速不存在).当然,这对于调试来说是无用的,但我想从完整感中提及它.
编辑2
我发现它:它是对工作目录的一种奇怪的依赖.如果从.vcproj所在的目录(VS通常使用F5和Ctrl + F5)启动,则目录中的相对路径将存在,并且调试输出(我忘记了它的存在)成功,从而减慢了运行速度.从任何其他目录执行使输出失败,从而加快执行速度.
我向所有花时间在这上面的人道歉.投票结束.
根据我的经验,这与低碎片堆有关。但是你说你已经设置了_NO_DEBUG_HEAP=1,所以我不知道这是否是正确的答案,我想你至少可以尝试一下。
低碎片堆 (LFH) 有助于减少堆碎片,启用后,如果您的应用程序使用大量内存分配,它可以将应用程序的性能提高 10 倍。
从 Windows Vista 开始,默认情况下启用 LFH,但是,LFH 被禁用。当进程在任何调试器下运行时,会自动为进程中的所有堆启用某些堆调试选项。这些堆调试选项阻止使用 LFH。
这解释了为什么如果从 VS 启动应用程序运行速度会慢 10 倍。(我过去遇到过同样的问题)。可以使用函数HeapQueryInformation获取堆信息并输出来验证是否是由于LFH禁用引起的。
LFH的详细内容可以参考这两篇文章:
论坛上有一篇类似的帖子:当我附加了调试器/IDE 时,为什么我的 STL 代码运行如此缓慢?
| 归档时间: |
|
| 查看次数: |
2429 次 |
| 最近记录: |