0) { a = 1; b = 4; } else { a = 2; b = 3; } 这可以用这样的三元运算来写: -6ren">
gpt4 book ai didi

iphone - 三元运算在iPhone中是否比 "if/else"更好

转载 作者:可可西里 更新时间:2023-11-01 04:11:51 26 4
gpt4 key购买 nike

我的程序中有这个 block :

if (x > 0) {
a = 1;
b = 4;
} else {
a = 2;
b = 3;
}

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

a = (x > 0) ? 1 : 2;
b = (x > 0) ? 4 : 3;

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

我的问题:在 ARM 级别,哪个更快?我相信第一个创建了一个分支指令。但是三元运算呢?它也变成 iPhone 上的一个分支吗?或者 iPhone 的 ARM 有一个邪恶的操作码来完成这项工作?

顺便说一句,我还看到了这样一个邪恶的技术:

a = (x > 0) * 1 + (x <= 0) * 2;

这真的更快吗?

最佳答案

编辑:

刚刚编译了您的示例,使用 GCC/LLVM、不同的优化,并查看了 ARM6 和 ARM7 汇编,这是我的结论:

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

这是 LLVM/ARM7 的最简洁结果,使用你提到的 IT 指令,如果 and 三元:

MOVS    R1, #2
CMP R0, #0
IT GT
MOVGT R1, #1
MOV.W R2, #3
IT GT
MOVGT R2, #4

ENDOFEDIT

只是搜索了一下这个主题,即使some people thinks ternary is less optimized大多数结果和更相关的说 it produce the same assembly code .

注意它可能随着 :

而改变
  1. 编译器 GCC、LLVM...
  2. 优化级别

我现在有点懒得反汇编代码,但也许我稍后会编辑该答案。

所以我会认为 djna 是对的,appart the 2* (x>0),如果不优化,这真的很令人惊讶,这是一样的。

在那之后,ternary or not ,这是一个品味问题。如果三元在代码中有意义并且可读,我更喜欢三元。

关于第二个例子,它是一个技巧,它使用了 true == 1/false == 0...有趣,但我不想维护该代码。

关于iphone - 三元运算在iPhone中是否比 "if/else"更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6155605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com