2016-08-08 9 views
-5

任意のデバイスからの数値入力を受け取り、その数値が0の場合は-1を返し、他のすべての場合はプログラムの実行を続行するプログラムを実行するとします。 C++でif-else対性能の場合

、そのコードの一部は次のようになります。

int main() { 
    if(number == 0) return -1; 
    /* 
     Here the rest of the program 
    */ 
    return 0; // End of program 
} 

または

int main() { 
    if(number == 0) return -1; 
    else { 
     /* 
      Here the rest of the program 
     */ 
    } 
    return 0; // End of program 
} 

私の質問は、これらのコード部分の一つは、より効率的である、ありますか?

はい、私は、特定の条件を満たす場合にプログラムを終了する必要がある場合、この正確なケースについてのみ話しています。

+10

私はそれらが同じコードを生成すると期待します。 – Barmar

+3

まずは、測定!第二に、コンパイラはこれを同じ方法で見ることができるはずです。LLVMスタイルガイド(Clangコンパイラで使用)は、読みやすくするために最初のものを書くことをお勧めします! – JVApen

+0

1.タイマーで自分で確認します。2.差額は0.00000000になります。 –

答えて

5

生成されたコードはまったく同じであるため、パフォーマンス上の違いはありません。

$ echo "int main() { int number; if (number == 0) return -1; return 0; }" | g++ -x c++ -S - -o /dev/stdout | md5sum 
9430c430d1f748cc920af36420d160ce - 

$ echo "int main() { int number; if (number == 0) return -1; else {} return 0; }" | g++ -x c++ -S - -o /dev/stdout | md5sum 
9430c430d1f748cc920af36420d160ce - 

$ echo "int main() { int number; if (number == 0) return -1; else {} return 0; }" | g++ -x c++ -S - -o /dev/stdout 
    .file "" 
    .text 
    .globl main 
    .type main, @function 
main: 
.LFB0: 
    .cfi_startproc 
    pushq %rbp 
    .cfi_def_cfa_offset 16 
    .cfi_offset 6, -16 
    movq %rsp, %rbp 
    .cfi_def_cfa_register 6 
    cmpl $0, -4(%rbp) 
    jne .L2 
    movl $-1, %eax 
    jmp .L3 
.L2: 
    movl $0, %eax 
.L3: 
    popq %rbp 
    .cfi_def_cfa 7, 8 
    ret 
    .cfi_endproc 
.LFE0: 
    .size main, .-main 
    .ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4" 
    .section .note.GNU-stack,"",@progbits 
1

私は効率の点で特に違いは見られません。私は入力が0なら、最初のコードが同じことをしていると思います。elseの必要はありません。コンパイラは既に-1を返していたでしょうから。

-4

アンのif-else文は、私はあなたが既に知っていると仮定し、意思決定のために使用されています。

if-elseステートメントで何かがうまくいかないと、コードに到達しないため、プログラム全体またはそのほとんどをelseブロックに書き込まないでください。

if-elseルートは、特にelse ifと併用すると、特に優れています。彼らはどちらも効率的ですが、ブラケット(良い練習/組織)を使用してください。

これは、同じステートメントであり、同等の効果がありますが、達成しようとしているものによって異なります。

以前のように、残りのプログラムはelseブロックに書き込まないでください。そうであれば、アプリケーションが正しく実行されないリスクが非常に高くなります。

if(number == 0) 
{ 
    return -1; 
} 

あなたの例では、この文だけが最適なルートになります。他のブロックはありません。

+0

あなたは「リスク」について話していますか? – user463035818

+0

何らかのエラーが発生したためにelseブロックに到達せず、「プログラムの残りの部分」が読み込まれないリスク。 elseブロックにプログラムの残りの部分を置くことは、多くのリスクをもたらします。プラス、悪い習慣です。 –

+0

エラーがあった場合に修正する必要があります。これは 'if'と' if-else'とは​​関係ありません。フレーズを投げるのではなく、いくつかの良い議論をしてください。これがロジックに適合すれば、elseブロックにプログラムの一部を持つことについての悪い習慣は何ですか?申し訳ありません、それは私には意味がありません。 – user463035818

1

コンパイラの最適化をオフにした場合は、if-elseより速くなることがあります。

これは、実行時に可能な条件ジャンプが1つ少なくなるためです。

if(condition){ 
    /*code*/ 
} 
else{ 
    //Jump 1 
    /*code*/ 
} 
//Jump 2 

対:可能な場合、コンパイラはあなたのためにこれを行いますと、性能に違いはありませんがほとんどがあるはずで、コンパイラの最適化を

if(conditional){ 
    /*code*/ 
} 
//Jump 1 
/*code*/ 

これは、最もよく示されています。可能であれば、ハードウェア上の分岐予測もステートメントのうちの1つだけを使用しようとし、他のオプションが使用されるとパフォーマンス・ヒットが発生します。

関連する問題