【问题标题】:C++ performance, for versus whileC++ 性能,for 与 while
【发布时间】:2011-02-22 04:14:07
【问题描述】:

总的来说(或根据您的经验),for 和 while 循环的性能是否存在差异?

如果它们是双重/三重嵌套怎么办?

g++ 或 Intel 编译器中的循环变体是否会影响矢量化 (SSE)?

谢谢

【问题讨论】:

  • 我很高兴你只是暂时残废了。我是永久的,我认为这让我有点逆势。我不仅是开箱即用的,我也无法in。无论如何,如果您像我尝试展示的那样进行认真的优化,您可能会意识到这样的事情只有在性能调整的最后阶段才会有所作为。祝你学业顺利。
  • @Mike 谢谢。很抱歉听到你的消息。可悲的是,一个人认为很多事情是理所当然的,然后一旦失去它们就会意识到它们的重要性:-(

标签: c++ performance for-loop while-loop


【解决方案1】:

Here 是一篇很好的论文。

【讨论】:

  • 我认为这一段很好地总结了这一切:“优化 == 重要。但通常:可读代码 == 更重要。”我倾向于使用 for 循环进行迭代,因为很清楚您的循环变量在哪里被初始化和递增或递减。
【解决方案2】:

任何智能编译器都不会真正显示它们之间的区别。无论如何,for 循环实际上只是某种形式的 while 循环的语法糖。

【讨论】:

    【解决方案3】:

    这很容易通过查看拆卸来确定。对于大多数循环,假设您执行相同的工作,它们将是相同的。

    int i = 0;
    while (i < 10)
       ++i;
    

    相同
    for (int i = 0; i < 10; ++i)
       ;
    

    至于嵌套,它实际上取决于您如何配置它,但相同的设置应该产生相同的代码。

    【讨论】:

      【解决方案4】:

      应该是零差异,但请检查一下,因为我看到的确实很糟糕,旧版本的 GCC 在两者之间创建了不同的代码 ARM/Thumb 代码。一个优化了减法后的比较以设置零标志,而另一个则没有。很蹩脚。

      再次嵌套应该没有区别。不确定 SSE/矢量化的东西,但我再次希望没有区别。

      【讨论】:

        【解决方案5】:

        VS2015,英特尔至强 CPU

        long long n = 1000000000;
        int *v = new int[n];
        int *v1 = new int[2*n];
        
        start = clock();
        for (long long i = 0, j=0; i < n; i++, j+=2)
            v[i] = v1[j];
        end = clock();
        std::cout << "for1 - CPU time = " << (double)(end - start) / CLOCKS_PER_SEC << std::endl;
        
        p = v; pe = p + n; p1 = v1;
        start = clock();
        while (p < pe)
        {
            *p++ = *p1;
            p1 += 2;
        }
        end = clock();
        std::cout << "while3 - CPU time = " << (double)(end - start) / CLOCKS_PER_SEC << std::endl;
        

        for1 - CPU 时间 = 4.055

        while3 - CPU 时间 = 1.271

        【讨论】:

          【解决方案6】:

          应该可以忽略不计。优化编译器应该不存在这种区别。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-11-13
            • 2013-09-09
            • 2017-07-14
            • 2020-01-16
            • 2012-12-13
            • 2012-11-18
            • 1970-01-01
            相关资源
            最近更新 更多