谁执行得更快 - for或while循环

时间:2012-02-19 16:39:39

标签: c++

所以基本上我想知道,在C ++语言中这些循环的速度更快? 基本上,这些示例中哪一个编译得更快 -

int S = 1, D = 2, d = 1;
for(int x = 0; x < 10000; x++) {
  S += D/2-d *s;
}

int S = 1, D = 2, d = 1, x = 0;
while(x < 10000) {
  x++;
  S += D/2-d * S;
}

5 个答案:

答案 0 :(得分:10)

第二个例子可能编译得稍快一些,因为它长76个字符,而不是前77个字符,并且它使用不太复杂的语言结构(通过不那么复杂,我的意思是解析不那么复杂)。

答案 1 :(得分:8)

对于任何半合适的编译器,它应该编译为完全相同的代码。事实上,这个:

for (begin; cond; loop) {
    block;
}

在语义上等同于{continue loop,正如Seth Carnegie在下面所建议的那样):

{
    begin;

    while (cond) {
         block;
         loop;
    }
}

答案 2 :(得分:1)

编译时间和执行时间之间存在差异。对于执行时间,现在的编译器很可能生成相同的代码。编译时间......很可能也是一样。

请注意,您的示例不正确。这两个循环不相同。增量首先在while循环中执行。 for循环的等价物是:

while(x < 10000) {
  S += D/2-d * S;
  x++;
}

答案 3 :(得分:0)

能够回答的唯一“人”是分析器。

在更理论的层面上,编译器会将它们归结为相同的低级构造,如果事实上某些编译器在生成IR之前将for循环转换为while循环。

答案 4 :(得分:0)

在我的计算机上,此代码的平均差异为4毫秒(小于0.1%)。并且首先是哪个函数,a()或b()并不重要,第一个更慢,所以原因是调度程序如何工作,我认为。

#include <iostream>
#include  <QTime>

const long cycles = 1000000000;

void a()    {
    long s = 0;
    for(long x = 0; x < cycles; x++) {
        s++;
    }
}

void b()   {
    long x = 0;
    long s= 0;
    while(x < cycles) {
        x++;
        s++;
    }
}

int main(int argc, char *argv[])
{        
    QTime t1;
    t1.start();

    b();

    int i1 = t1.elapsed();
    t1.restart();

    a();

    int i2 = t1.elapsed();

    std::cout << i1 <<"\n"<< i2 <<"\n---\n";
    return 0;
}