在iPhone中,三元操作比"if/else"更好

Edu*_*sta 5 iphone arm ios

我的程序中有这个块:

if (x > 0) {
    a = 1;
    b = 4;
} else {
    a = 2;
    b = 3;
}
Run Code Online (Sandbox Code Playgroud)

这可以用这样的三元运算编写:

a = (x > 0) ? 1 : 2;
b = (x > 0) ? 4 : 3;
Run Code Online (Sandbox Code Playgroud)

结果是等价的,但它是我应用程序真正关键部分的一部分,每秒运行数千次.我想挤一些微秒,因为这种方法会增长一点.

我的问题:在ARM级别,哪一个更快?我相信第一个创建分支指令.但三元运作怎么样?它也成为iPhone上的一个分支吗?或iPhone的ARM有一个邪恶的操作码来完成这项工作?

顺便说一句,我也看到了这样一种邪恶的技巧:

a = (x > 0) * 1 + (x <= 0) * 2;
Run Code Online (Sandbox Code Playgroud)

这真的更快吗?

Vin*_*rci 9

编辑:

刚刚编译了您的示例,使用GCC/LLVM,进行了不同的优化,并查看了ARM6和ARM7程序集,以下是我的结论:

  • ARM-ASM因GCC/LLVM和目标体系结构而异
  • 但是,当使用最高优化级别时,它为if和ternary生成完全相同的汇编代码,无论编译器/ arch是什么.(是的,比较几对;)

LLVM/ARM7使用IT您提到的指令,对于if 三元,这是最简洁的结果:

MOVS    R1, #2
CMP     R0, #0
IT GT
MOVGT   R1, #1
MOV.W   R2, #3
IT GT
MOVGT   R2, #4
Run Code Online (Sandbox Code Playgroud)

ENDOFEDIT

刚刚对该主题进行了一些搜索,即使有些人认为三元数据的优化程度较低,但最相关的结果却更为相关,并表示它会生成相同的汇编代码.

注意它可能会改变:

  1. 编译器GCC,LLVM ......
  2. 优化水平

我现在有点懒惰来反汇编代码,但也许我稍后会编辑这个答案.

所以我认为djna是正确的,设置2*(x>0),如果没有优化,这将是非常令人惊讶的,这是相同的.

在那之后,三元与否,这是一个品味问题.当代码有意义并且可读时,我更喜欢三元数.

关于第二个例子是一个技巧使用的事实,真正的== 1 /假== 0 ...滑稽,但我不希望维护该代码.

  • 实际的,经验性的细节+1而不是"我不认为*这很重要". (3认同)