我有一个中等规模的本地 C++ 应用程序。当我在 Visual Studio (2008) 中运行它时,它的运行速度比从 Visual Studio 外部运行大约慢 10 倍。这适用于调试和发布版本,无论我是通过“开始调试”(F5)还是“不带调试启动”(Ctrl+F5)来运行应用程序。
换句话说: 在 Visual Studio 中运行 Release 版本 没有 调试器时,比从命令提示符(或从 Windows Explorer)运行相同的可执行文件慢 10 倍。
我尝试过的事情:
该应用程序使用 OpenGL 和 Qt,并执行相当普通的操作: 仅在启动时进行文件输入(3D 模型和着色器),没有文件输出,很少使用第三方库(除了 Qt 外,所有库都链接静态)。
更让人沮丧的是,在最近对应用程序进行内部重构之后,我才开始遇到这种行为。在此之前,它在 VS 内外都运行良好。这次重构主要涉及将一些功能提取到新创建的基类中(即,将
我找到原因了:这是一个关于工作目录的奇怪依赖。如果从.vcproj所在的目录启动(这是VS通常使用F5和Ctrl + F5进行的),目录中的相对路径将存在,并且调试输出(我已经忘记了其存在)将成功,减慢运行速度。从任何其他目录执行都会导致输出失败,从而导致更快的执行速度。
对于所有花费时间的人,我深表歉意。投票关闭。
换句话说: 在 Visual Studio 中运行 Release 版本 没有 调试器时,比从命令提示符(或从 Windows Explorer)运行相同的可执行文件慢 10 倍。
我尝试过的事情:
- 仔细检查是否设置了断点、跟踪点、异常调试等。没有任何问题。
- 为应用程序在 VS 调试属性中设置
_NO_DEBUG_HEAP=1
。没有效果。 - 将
cmd /c set PATH
设置为由 Ctrl+F5 运行而不是应用程序本身,并将其与 VS 外部可用的PATH
进行比较。没有区别。 - 在 exe 上运行 DependencyWalker 并将其与 Visual Studio 在运行应用程序时列出的库进行比较。没有区别。
- 谷歌和搜索 SO,但这只涉及到上述想法或处理 F5 vs. Ctrl+F5 的差异(在我的情况下没有差异)。
该应用程序使用 OpenGL 和 Qt,并执行相当普通的操作: 仅在启动时进行文件输入(3D 模型和着色器),没有文件输出,很少使用第三方库(除了 Qt 外,所有库都链接静态)。
更让人沮丧的是,在最近对应用程序进行内部重构之后,我才开始遇到这种行为。在此之前,它在 VS 内外都运行良好。这次重构主要涉及将一些功能提取到新创建的基类中(即,将
A > B
继承改为 A > C > B
继承,只涉及很少的虚拟调用),并将一些 new[]
调用替换为 std::vector
。我找到原因了:这是一个关于工作目录的奇怪依赖。如果从.vcproj所在的目录启动(这是VS通常使用F5和Ctrl + F5进行的),目录中的相对路径将存在,并且调试输出(我已经忘记了其存在)将成功,减慢运行速度。从任何其他目录执行都会导致输出失败,从而导致更快的执行速度。
对于所有花费时间的人,我深表歉意。投票关闭。