2012-02-19 18 views
0

基本的に私は、C++言語のこれらのループより速いのは誰ですか?より高速なコンパイルを行うので、これらの実施例の基本的 、 -より速いwhileループまたはwhileループを実行する人

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; 
} 
+4

タイムアウトしましたか? – Mysticial

+3

(1)「コンパイルが速くなりますか?あなたは「もっと速く走る」という意味ですか? (2)コンパイラにマイクロ最適化をさせて、より読みやすいものを実行する必要があります。読みやすさはプログラマのためであり、最適化はコンパイラのためのものです – amit

+0

[どのループが速いか、またはどんなループであるか]の複製が可能です(http://stackoverflow.com/questions/3629174/what-loop-is-faster-while-or-for) –

答えて

0

それはプロファイラで答えることができる唯一の「人」。

理論的には、一部のコンパイラがforのループをIRの生成前にwhileループに回す場合、コンパイラは同じ低レベルの構造にそれらを取り除きます。

+0

そして必要ならばループを展開することさえできます! – BeRecursive

+0

またはループが確定であるため、それだけで結果を計算し、ちょうど彼らがループの終わりになると完全にループを除去するであろう値に変数を初期化することができます。 –

7

半二重のコンパイラでは、と同じコードを正確ににコンパイルする必要があります。実際には、この:

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

は(セス・カーネギーは、以下の提案として、loopcontinueがなければ)と同じ意味です:

{ 
    begin; 

    while (cond) { 
     block; 
     loop; 
    } 
} 
+1

**正確に**同じコードではないかもしれませんが、forループの 'x ++'は 'S'を変更した後になりますね。 – amit

+1

@amit: 'x ++'は 'S + = D/2-d * S'の式で使われておらず、どちらも副作用がないので、2つの式はコンパイラによって任意に切り替えることができます。したがって、どちらの順序も定義されていません:) – orlp

+0

これらの2つは正確には等価ではありません( 'continue'とその他のものがあります) –

10

それが76個の文字であるため、2番目の例では、おそらく若干速くコンパイルします最初の77文字とは対照的に長いですし、複雑ではない言語構造を使用します(それほど複雑ではないので、解析するのがより簡単です)。

+0

本当です!本当です! –

+0

セスカーネギー:天才! – orlp

+0

+1これも好きです! – Mysticial

1

コンパイル時間と実行時間には違いがあります。実行時には、今日ではコンパイラが同じコードを生成する可能性が最も高いでしょう。コンパイル時間は...同じである可能性が最も高い。

例は正しくありません。です。 2つのループは同等ではありません。インクリメントは最初にwhileループで実行されます。 forループの等価物は次のようになります

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

'私は気づいていない 'S'にある程度の魔法的な支持を持っていますか? –

+1

ああ...........? –

+0

@LightnessRacesinOrbitああ、あなたはこの場合、それは問題ではないと言っていた。風刺からは分かりませんでしたが、はい、そうです。 –

0

コンピューター上でこのコードは、平均の差の4ミリ秒(0.1%未満)を得ます。そして、どの関数が最初に動くかは問題ありません。最初の方が遅いので、スケジューラーの仕組みがどういうものなのでしょうか。

#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; 
} 
関連する問題