假设我想要一个从任何设备接受数字输入的程序,如果该数字为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);
});
});
我的问题是,这些代码部分中哪一个更有效?
是的,我只是谈论这个确切的情况,当你需要退出程序时,如果它符合某个条件。
答案 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;
}
仅此声明就是您示例中的最佳路线。没有其他阻止。