1

これは:

int x=0;
for (int i=0;i<100;i++) 
    x++;
for (int i=0;i<100;i++) 
    x--;
for (int i=0;i<100;i++) 
    x++;
return x;

これと同じ:

int x=0;
for (int i=0;i<100;i++){
    x++;
    x--;
    x++;
}
return x;

注:これは単なる例であり、実際のループははるかに複雑になります。

では、これら2つのループは同じですか、それとも2番目のループの方が速いのでしょうか。

編集: JavaまたはC++。私は両方について疑問に思いました。
コンパイラが実際にコードを最適化することを知りませんでした。

4

2 に答える 2

3

最適化されていない:ループオペコードが3セットあるため、3つのループに時間がかかります。

最適化されており、オプティマイザーによって異なります。x++;x--;優れたオプティマイザは、シングルループバージョンのステートメントが互いに打ち消し合い、それらを排除することを理解するのに十分賢い場合があります。本当に賢いオプティマイザーは、別々のループで同じことを行うことができるかもしれません。ばかばかしいほどスマートなオプティマイザーは、コードが何をしているのかを理解し、ブロック全体を次のように置き換えるだけかもしれませんreturn 100; (以下の追加の注記を参照)

しかし、最適化の実際の答えは通常、fuhgeddaboutitです。コードが正しく機能し、十分に高速である場合は、そのままにしておきます。実際のテストで遅すぎることが示された場合にのみ、プロファイリングしてボトルネックを特定し、より効率的なコードに置き換える必要があります。(または完全に優れたアルゴリズム。)

プログラマーは高価であり、CPUサイクルは安価であり、他にも大きな見返りのあるタスクがたくさんあります。そして、書くのももっと楽しいです。


「ばかばかしいほどスマートなオプティマイザー」ビットについて:D言語はコンパイル時関数評価を提供します。CTFEを使用すると、言語のほぼすべての機能を使用して、ビルド時に何かを計算し、計算された回答のみをランタイムコードに挿入できます。つまり、コンパイラ全体を、選択したコードチャンクのオプティマイザに明示的に変換できます。

于 2013-03-06T07:39:50.623 に答える
1

各インクリメント、デクリメント、割り当て、および比較を1つの操作としてカウントすると、最初の例には約900の操作があり、2番目の例には約500の操作があります。つまり、コードがそのまま実行され、最適化されていない場合です。どちらがよりパフォーマンスが高いかは明らかです。

実際には、コードはコンパイラーによって最適化される場合とされない場合があり、言語ごとに異なるコンパイラーは、最適化でまったく異なる仕事をします。

于 2013-03-06T07:37:04.977 に答える