if-else vs如果表现

时间:2016-08-08 20:00:52

标签: c++ performance if-statement

假设我想要一个从任何设备接受数字输入的程序,如果该数字为0则返回-1,但在所有其他情况下继续执行该程序。

在C ++中,部分代码是:

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

$(function() {
        var alert = $('div.alert[auto-close]');
        alert.each(function() {
            var time_period = $(this).attr('auto-close'); 
            setTimeout(function() {
                $(this).alert('close');
            }, time_period);
        });
     });

我的问题是,这些代码部分中哪一个更有效?

是的,我只是谈论这个确切的情况,当你需要退出程序时,如果它符合某个条件。

4 个答案:

答案 0 :(得分: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 :(得分:1)

我没有看到效率方面的任何具体差异。我认为第一个代码是做同样的事情而且不需要else,因为如果输入是-1,编译器已经返回0

答案 2 :(得分:1)

如果在某些情况下比if-else更快,则关闭编译器优化。

这是因为在运行时可能有一个可能的条件跳转。最好显示为:

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

Vs的:

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

对于编译器优化,性能应该没什么差别,因为编译器会尽可能地为您执行此操作。硬件上的分支预测也会尝试仅使用其中一个语句,只有在使用其他选项时才会出现性能损失。

答案 3 :(得分:-4)

if-else语句用于决策,我假设您已经知道。

不要在else块中写入整个程序或大部分程序,因为如果在if-else语句中出现任何问题,那么永远不会达到该代码。

if-else路由主要更好,特别是与else if一起使用时。它们都很有效,但使用BRACKETS(良好做法/组织)

当涉及到它时,它们是相同的陈述并具有相同的效果,但这取决于你想要实现的目标。

就像我之前说的那样,不要在else块中写下你的程序的其余部分。如果是这样,应用程序无法正常运行的风险要高得多。

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

仅此声明就是您示例中的最佳路线。没有其他阻止。