我的程序中有这个块:
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)
这真的更快吗?
编辑:
刚刚编译了您的示例,使用GCC/LLVM,进行了不同的优化,并查看了ARM6和ARM7程序集,以下是我的结论:
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
刚刚对该主题进行了一些搜索,即使有些人认为三元数据的优化程度较低,但最相关的结果却更为相关,并表示它会生成相同的汇编代码.
注意它可能会改变:
我现在有点懒惰来反汇编代码,但也许我稍后会编辑这个答案.
所以我认为djna是正确的,设置2*(x>0)
,如果没有优化,这将是非常令人惊讶的,这是相同的.
在那之后,三元与否,这是一个品味问题.当代码有意义并且可读时,我更喜欢三元数.
关于第二个例子是一个技巧使用的事实,真正的== 1 /假== 0 ...滑稽,但我不希望维护该代码.
归档时间: |
|
查看次数: |
6145 次 |
最近记录: |