if 语句与 if-else 语句,哪个更快?

新手上路,请多包涵

前几天我和一个朋友就这两个片段发生了争执。哪个更快,为什么?

 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 许可协议

阅读 573
2 个回答

TL;DR: 在未优化的代码中, if 没有 else 似乎效率更高,但即使启用了最基本的优化级别,代码基本上也被重写为 value = condition + 5 .


试了一下 并为以下代码生成了程序集:

 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]

对于 ifonly ,而 ifelse

 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]

后者看起来效率略低,因为它有一个额外的跳跃,但两者都至少有两个和最多三个任务,所以除非你真的需要挤压每一滴性能(提示:除非你在航天飞机上工作,否则你不需要,即使那样你也 可能 不会)差异不会很明显。

但是,即使使用最低优化级别( -O1 ),这两个函数也会减少到相同的程度:

 test    dil, dil
setne   al
movzx   eax, al
add     eax, 5

这基本上相当于

return 5 + condition;

假设 condition 是零或一。更高的优化级别并不会真正改变输出,除非它们通过在开始时有效地将 EAX 寄存器归零来设法避免 movzx


免责声明: 您可能不应该自己编写 5 + condition (即使标准保证将 true 转换为整数类型会给出 1 )因为您的意图可能不是对阅读您的代码的人(可能包括您未来的自己)来说是显而易见的。这段代码的重点是表明编译器在两种情况下生成的内容(实际上)是相同的。 Ciprian Tomoiaga 在评论中说得很好:

人类 的工作是 为人类 编写代码,让 编译器机器 编写代码。

原文由 CompuChip 发布,翻译遵循 CC BY-SA 3.0 许可协议

在未优化的代码中,第一个示例总是分配一个变量一次,有时分配两次。第二个示例只分配一次变量。两个代码路径上的条件是相同的,所以这无关紧要。在优化的代码中,它取决于编译器。

与往常一样,如果您很担心,请生成程序集并查看编译器实际在做什么。

原文由 Neil 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题