奇怪的 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 执行与手动编译/执行相当?

谢谢。

【问题讨论】:

您是否在比较 releaserelease 以及相同的优化级别(或同等级别)? 您是在使用或不使用 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 行为:执行时间很长的主要内容,如果未能解决你的问题,请参考以下文章

C++ 奇怪行为 Visual Studio

Visual Studio / VB.Net 2008 IntelliSense 奇怪行为

Visual Studio中的奇怪Python包导入行为

Visual Studio C++ 编译器在局部变量对象上的奇怪行为

Xamarin Forms - 从 2017 年到 2019 年更新 Visual Studio 后 iOS 上的奇怪行为

Visual Studio 奇怪的异常