前几天我和一个朋友就这两个片段发生了争执。哪个更快,为什么?
value = 5;
if (condition) {
value = 6;
}
和:
if (condition) {
value = 6;
} else {
value = 5;
}
如果 value
是一个矩阵怎么办?
注意:我知道 value = condition ? 6 : 5;
存在,我希望它更快,但这不是一个选项。
编辑(由工作人员要求,因为问题目前处于搁置状态):
- 请考虑由主流编译器( 比如 g++、clang++、vc、mingw )在优化和非优化版本中生成的 x86 程序集 或 MIPS 程序集 来回答。
- 当程序集不同时,解释为什么版本更快以及何时( 例如“更好,因为没有分支和分支有以下问题等等” )
原文由 Julien__ 发布,翻译遵循 CC BY-SA 4.0 许可协议
TL;DR: 在未优化的代码中,
if
没有else
似乎效率更高,但即使启用了最基本的优化级别,代码基本上也被重写为value = condition + 5
.我 试了一下 并为以下代码生成了程序集:
在禁用优化的 gcc 6.3 (
-O0
) 上,相关区别是:对于
ifonly
,而ifelse
有后者看起来效率略低,因为它有一个额外的跳跃,但两者都至少有两个和最多三个任务,所以除非你真的需要挤压每一滴性能(提示:除非你在航天飞机上工作,否则你不需要,即使那样你也 可能 不会)差异不会很明显。
但是,即使使用最低优化级别(
-O1
),这两个函数也会减少到相同的程度:这基本上相当于
假设
condition
是零或一。更高的优化级别并不会真正改变输出,除非它们通过在开始时有效地将EAX
寄存器归零来设法避免movzx
。免责声明: 您可能不应该自己编写
5 + condition
(即使标准保证将true
转换为整数类型会给出1
)因为您的意图可能不是对阅读您的代码的人(可能包括您未来的自己)来说是显而易见的。这段代码的重点是表明编译器在两种情况下生成的内容(实际上)是相同的。 Ciprian Tomoiaga 在评论中说得很好: