奇怪的 Visual Studio 行为:执行时间很长
Posted
技术标签:
【中文标题】奇怪的 Visual Studio 行为:执行时间很长【英文标题】:Strange Visual Studio Behavior: Very long execution time 【发布时间】:2015-02-10 23:21:35 【问题描述】:我注意到有些代码需要很长时间才能在 Visual Studio 中执行,而不是使用 CL 手动编译并运行可执行文件。
下面是展示这种行为的代码示例:
int DP[MAX][MAX];
class CartInSupermarketEasy
public:
int calc(int N, int K)
clock_t begin = clock();
for (int i = 0; i < MAX; ++i)
DP[0][i] = 0;
DP[1][i] = 1;
DP[i][0] = i;
for (int n = 1; n <= N; ++n)
for (int k = 0; k <= K; ++k)
int min_res = N;
for (int i = 1; i < n; ++i)
for (int j = 0; j < k; ++j)
int curr_res = max(DP[n - i][k - 1 - j], DP[i][j]) + 1;
min_res = min(curr_res, min_res);
DP[n][k] = min(min_res, DP[n - 1][k] + 1);
clock_t end = clock();
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
cout << elapsed_secs << '\n';
return DP[N][K];
CI;
int main()
cout << CI.calc(100,100) << '\n';
return 0;
在 VS2013 中运行时,函数 calc 大约需要 13.5 秒来计算答案。在 VS2012 中,这下降到 3.5 秒。但是,当使用 CL(或我尝试过的任何其他编译器)手动编译时,可执行文件会在 0.4 秒内返回答案。
如何解释这种差异,如何使 VS 执行与手动编译/执行相当?
谢谢。
【问题讨论】:
您是否在比较 release 与 release 以及相同的优化级别(或同等级别)? 您是在使用或不使用 IDE 的情况下对 Visual Studio 版本进行计时吗? 是的,我实际上并没有将其与发布进行比较,而是与调试构建进行比较。谢谢你,也感谢之前发表评论的 Pawel,但我再也看不到他的评论了。 您使用的是std::max
函数还是您自己编写的函数?与min
函数相同。编译器可能有这些函数的优化版本。
顺便问一下,您可以安全地访问您的阵列吗?当k
小于等于j
时,使用max
函数时会有负索引。
【参考方案1】:
问题是我使用“调试”配置而不是“发布”配置运行。将构建配置更改为“发布”已解决问题。有趣的是,它现在的运行速度比手动编译/执行快了大约 4 倍。
更新: 正如 cmets 中所指出的,很多减速是由于使用 std::min 和 std::max 函数造成的。切换到定制的最小/最大功能,将执行速度提高了 3-4 倍。这里有一篇文章证实了这一观察:std::min causing three times slowdown
【讨论】:
我不知道你用的是什么电脑,但你的程序在我使用 VS2013/Win32/Debug 时大约需要 0.1 秒。 真的吗?很奇怪。这就是我现在发布的内容,但调试仍然给我 13.4 秒。 我试过这样做,但我不知道如何从报告中理解为什么在 Debug 中需要这么长时间。 您使用的是Performance Wizard吗?如果没有,您仍然可以上传报告,我们将查看导致速度下降的原因。 有趣:我用定制的函数替换了 std::min/max 函数,Debug 中的运行时间减少了 x10 到 1.46 秒,这仍然比发布运行时间多 10 倍。这是性能报告的链接(仍然使用 std::min/max)Work150211.vsp以上是关于奇怪的 Visual Studio 行为:执行时间很长的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio / VB.Net 2008 IntelliSense 奇怪行为
Visual Studio C++ 编译器在局部变量对象上的奇怪行为
Xamarin Forms - 从 2017 年到 2019 年更新 Visual Studio 后 iOS 上的奇怪行为