【问题标题】:Are while loops more efficient than for loopswhile 循环比 for 循环更有效吗
【发布时间】:2016-04-15 03:29:12
【问题描述】:

有人告诉我,while 循环比 for 循环更有效。 (c/c++) 这看起来很合理,但我想找到一种方法来证明或反驳它。

我已经使用类似的 sn-ps 代码尝试了三个测试。每个都只包含一个具有相同输出的 for 或 while 循环:

  1. 编译时间 - 大致相同
  2. 运行时间 - 相同
  3. 编译为 intel 汇编代码并进行比较 - 相同的行数和几乎相同的代码

我是否应该尝试其他方法,或者任何人都可以确认一种方法或另一种方法吗?

【问题讨论】:

  • 它们是一样的。唯一的区别是操作的逻辑顺序和相应的可读性。
  • 谁告诉你的——不要再听那个人的了。
  • 哈哈,紫罗兰色长颈鹿。很好的建议。已经在关注了。我再也不想见到那个可怕的人了。这就是我从统计热力学教授那里获得编程建议的结果。
  • 感谢您努力验证您被告知的内容,而不是简单地接受它的表面价值。

标签: c++


【解决方案1】:

所有循环都遵循相同的模板:

{
// Initialize
LOOP: 
    if(!(/* Condition */) ) {
        goto END
    }

    // Loop body

    // Loop increment/decrement
    goto LOOP
}
END:

因此两个循环是相同的:

// A
for(int i=0; i<10; i++) {
    // Do stuff
}

// B
int i=0;
while(i < 10) {
    // Do stuff
    i++;
}

// Or even
int i=0;
while(true) {
    if(!(i < 10) ) {
        break;
    }

    // Do stuff
    i++;
}

两者都转换为类似于:

{
int i=0;
LOOP: 
    if(!(i < 10) ) {
        goto END
    }

    // Do stuff

    i++;
    goto LOOP
}
END:

未使用/无法访问的代码将从最终的可执行文件/库中删除。

Do-while 循环跳过第一个条件检查,留给读者作为练习。 :)

【讨论】:

    【解决方案2】:

    当然,LLVM 会将所有类型的循环转换为一致的形式(当然,在可能的范围内)。因此,只要您具有相同的功能,使用forwhiledo-whilegoto 来形成循环并不重要,只要它具有相同的初始化、退出条件和更新语句和正文,它将产生完全相同的机器码。

    如果在优化过程中足够早地完成,在编译器中实现这一点并不难(因此编译器仍然可以理解实际编写的内容)。这种“使所有循环相等”的目的是您只需要一种方法来优化循环,而不是使用一种用于 while 循环、一种用于 for-loops、一种用于 do-while 循环和一种用于“任何其他循环” ”。

    不能保证所有编译器都可以,但我知道 gcc/g++ 也会生成几乎相同的代码,无论您使用什么循环结构,而且据我所知,微软也这样做。

    【讨论】:

      【解决方案3】:

      C 和 C++ 编译器实际上将高级 C 或 C++ 代码转换为汇编代码,而在汇编中我们没有 whilefor 循环。我们只能检查一个条件并跳转到另一个位置。

      因此,forwhile 循环的性能在很大程度上取决于编译器优化代码的能力。

      这是一篇关于代码优化的好论文:

      http://www.linux-kongress.org/2009/slides/compiler_survey_felix_von_leitner.pdf.

      【讨论】:

        猜你喜欢
        • 2013-06-28
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 2017-11-29
        • 2011-01-29
        • 1970-01-01
        • 2014-03-15
        • 2014-09-02
        相关资源
        最近更新 更多