TL;DR:在未优化的代码中,if
没有else
似乎效率更高,但即使启用了最基本的优化级别,代码也基本上被重写为value = condition + 5
.
I 尝试了一下 https://gcc.godbolt.org/并生成以下代码的程序集:
int ifonly(bool condition, int value)
{
value = 5;
if (condition) {
value = 6;
}
return value;
}
int ifelse(bool condition, int value)
{
if (condition) {
value = 6;
} else {
value = 5;
}
return value;
}
在禁用优化的 gcc 6.3 上(-O0
),相关差异为:
mov DWORD PTR [rbp-8], 5
cmp BYTE PTR [rbp-4], 0
je .L2
mov DWORD PTR [rbp-8], 6
.L2:
mov eax, DWORD PTR [rbp-8]
for ifonly
, while ifelse
has
cmp BYTE PTR [rbp-4], 0
je .L5
mov DWORD PTR [rbp-8], 6
jmp .L6
.L5:
mov DWORD PTR [rbp-8], 5
.L6:
mov eax, DWORD PTR [rbp-8]
后者看起来效率稍低,因为它有一个额外的跳跃,但两者都有至少两个和最多三个任务,所以除非你真的需要压缩每一滴性能(提示:除非你在航天飞机上工作,否则你不会,即使这样你probably不要)差异不会很明显。
然而,即使采用最低的优化级别(-O1
)两个函数简化为相同:
test dil, dil
setne al
movzx eax, al
add eax, 5
这基本上相当于
return 5 + condition;
假设condition
为零或一。
更高的优化级别并不会真正改变输出,除非它们设法避免movzx
通过有效地归零EAX
在开始时注册。
免责声明:你可能不应该写5 + condition
你自己(尽管标准保证转换true
到一个整数类型给出1
)因为对于阅读你的代码的人(可能包括未来的你)来说,你的意图可能不会立即显而易见。这段代码的目的是表明编译器在这两种情况下生成的内容(实际上)是相同的。西普里安·托莫亚加 https://stackoverflow.com/questions/43202012/if-statement-vs-if-else-statement-which-is-faster/43202221?noredirect=1#comment73501865_43202221评论里说得很好:
a human的工作是写代码对于人类并让compiler编写代码机器.