2009-07-24 8 views
0

if文のすべてのブロックが返ってきたらif/else ifを持つ方が良いでしょうか、あるいはifの連鎖を持つ方が良いでしょうか?Cでは、より高速です:返り値であれば、そうでなければ返値で?

A:

if (condition1) { 
    code1; 
    return a; 
} 
if (condition2) { 
    code2; 
    return b; 
} 
//etc... 

B:最速の場合、具体的には

if (condition1) { 
    code1; 
    return a; 
} 
else if (condition2) { 
    code2; 
    return b; 
} 
//etc... 
+0

私は前者が高速ですが、最初の条件が満たされない限りブロック2が実行されないことが明確になっているので、2番と一緒に行く方が良いかもしれません。 – mpen

+7

いいえ、CはCPUレベルで何が起こるかを指示しません。 JMPステートメントを持たないCPUアーキテクチャーでは、ステートメントを実行しても結果を破棄するためにフラグを使用しています。それはスピードが同じであることを意味します。私の主張は、Cコードがどのようなものになるのかを想定することはできません。 – paxdiablo

+2

"architecture ...フラグを使用して文を実行しますが、結果を破棄します。"たとえばARMには、条件フラグが設定されている場合に実行される条件付き命令があり、条件フラグがセットされていない場合にはnopとして動作します。ジャンプが多くのオプションよりも遅くなる場合は、コンパイラによって発行されます。 –

答えて

43

それは違いはありません、これはマイクロ最適化時の不要な試みです。

+0

+1です。まともなコンパイラはelseが必要でないことに気づくでしょう。 –

+6

マイクロ最適化さえできません。それは0-最適化です。 –

+0

あなたはそうです。明確にするために編集されました。 :) –

0

これは、最適化されたビルドで同じ動作をするはずです。そうでなければ、他の何かが、コンパイラが「適切なこと」をするのを妨げる可能性があります。

Robboticが間違っています。どちらの場合も、最初の句が真であれば、その部分文は実行されません(評価されます)。

注意してください。間違ったことを最適化している可能性があります。

14

C標準ではではありません。では、Cコードに基づいてどのマシン言語が作成されるかを決定します。基礎となるアーキテクチャを理解していても、それが賢明でない場合でも、時には前提を作ることができます。

CPUがシンプルなビーストで、パイプライン処理、複数のレベルのキャッシュ、その他のさまざまな驚異的な処理を行い、スピードを制限してしまう日々が長くなりました。

特定の問題が発生するまでは、このレベルの最適化について心配する必要はありません。

可読コードを書きます。

これはルール番号1,2および3でなければなりません。ソフトウェア開発の最大の問題は、最大スピードの99.5%で実行されるコード、または開発者が何を同僚(またはそれ自身でさえ)は6か月前にしたのですか?

私は、問題が見つかった場合にのみパフォーマンスを心配し、ターゲットプラットフォーム上でベンチマークをベンチマークして最大限の改善が得られる場所を確認します。 ifステートメントの1%の改善は、コード内の他の場所(コードが呼び出された回数など、もちろん同等)で、より優れたアルゴリズムを選択することによって、わずらわしくなる可能性があります。最高のバング・イン・ザ・バンを得るには、常に最適化を目標にする必要があります。

+0

++グラフィックや何かをしていて、ルーチンが実際のホットスポットで、サイクル・スクイージングの恩恵を受けることがある場合は、気になるかもしれません。他の99.99%の時間、パフォーマンスの問題は、コーダーが思うよりもはるかに多い機能への過剰な呼び出しによって引き起こされます。 –

3

これらの返品では、elseは超過です。コンパイラはこれを理解するのに十分なほどスマートです。

コンパイラが両方に対して同じコードを生成すると思われます。それを分解して見なさい。

いずれにしても、コンパイラの出力と経験的なパフォーマンステストを調べることが確実な唯一の方法です。

2

これらは、ほとんどのアーキテクチャで同等である必要があります。生成される命令はおそらくまだ同じbne、cmps、retsです。

if文の代わりにswitch/caseを使用すると役立つことがあります。

+0

heh、brilliant! .. – Claudiu

2

私が本当にあれば、それは大きな違いだとは思わない:

ケースの場合:Bケースについては

if (condition){ 
    //conditionOp 
    //cmp ... , ... 
    //jxx :toEndIf 
    code; 
    return bar; 
    //mov eax, bar 
    //jmp :toEnd 
} 
if(condition){ 
    //conditionOp 
    //cmp ... , ... 
    //jxx :toEndIf 
    code; 
    return bar; 
    //mov eax, bar 
    //jmp :toEnd 
} 

:したがって

if(condition){ 
    //conditionOp 
    //cmp ... , ... 
    //jxx :toElse + 1 
    code; 
    return bar; 
    //mov eax , bar 
    //jmp :toEnd 
} else 
    //jmp :endElse 
if (condition2){ 
    //conditionOp 
    //cmp ... , ... 
    //jxx :endElse 
    code; 
    return bar; 
    //mov eax, bar 
    //jmp :toEnd 
} 

、使用してBケースの場合、1つの余分な命令が追加されます。しかし、サイズを最適化すると、それを取り除くことができます。

+1

+1余分なヤードに行っても、それは特定のCPU /コンパイラ/最適化レベル/相の月のためにそれを述べたいと思うかもしれません。 – paxdiablo

+0

たとえば、GCCでは、最適化を行わなくても、x86の場合はこのようなコードは出力されません。 –

1

これを測定して調べるための簡単なテストプログラムを作成しますが、これは不要な最適化です。

関連する問題