Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
三元操作是否优于“三元操作”;如果/否则“;在iPhone中_Iphone_Ios_Arm - Fatal编程技术网

三元操作是否优于“三元操作”;如果/否则“;在iPhone中

三元操作是否优于“三元操作”;如果/否则“;在iPhone中,iphone,ios,arm,Iphone,Ios,Arm,我的程序中有此块: if (x > 0) { a = 1; b = 4; } else { a = 2; b = 3; } 这可以通过如下三元操作写入: a = (x > 0) ? 1 : 2; b = (x > 0) ? 4 : 3; a = (x > 0) * 1 + (x <= 0) * 2; 结果是等价的,但它是我的应用程序中非常关键的一部分,每秒运行数千次。我想压缩几微秒,因为这个方法会增长一点 我的问题是:在手臂水平

我的程序中有此块:

if (x > 0) {
    a = 1;
    b = 4;
} else {
    a = 2;
    b = 3;
}
这可以通过如下三元操作写入:

a = (x > 0) ? 1 : 2;
b = (x > 0) ? 4 : 3;
a = (x > 0) * 1 + (x <= 0) * 2;
结果是等价的,但它是我的应用程序中非常关键的一部分,每秒运行数千次。我想压缩几微秒,因为这个方法会增长一点

我的问题是:在手臂水平,哪一个更快?我相信第一种方法创建了分支指令。但是三元运算呢?它是否也成为iPhone的一个分支?或者iPhone的手臂上有一个邪恶的操作码来完成这项工作

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

a = (x > 0) ? 1 : 2;
b = (x > 0) ? 4 : 3;
a = (x > 0) * 1 + (x <= 0) * 2;
a=(x>0)*1+(xNo

代码高尔夫没有赢家

可读性获胜

因此,在本例中,您的第一个使用传统条件块的示例的可读性大约是709909034902倍。任何人即使稍微熟悉编程,也能够理解正在发生的事情


在后一个例子中…上帝,那是什么!

一个智能编译器可以为任一代码生成相同的输出


非智能编译器将导致(X>0)在三元运算符情况下被计算两次,因此速度较慢!

为了可读性,您不是编译器

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

  • ARM-ASM因GCC/LLVM和目标体系结构而异
  • 但是,当使用最高的优化级别时,会为if和ternal生成完全相同的汇编代码,不管编译器/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
ENDOFEDIT

只是搜索了一下这个话题,即使最相关的结果是这样说的

注意,它可能会随着以下情况而变化:

  • 编译器GCC,LLVM
  • 优化水平
  • 我现在有点懒于反汇编代码,但也许我以后会编辑这个答案

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

    在那之后,这是一个品味的问题。 我更喜欢三元组,因为它在代码中有意义并且可读

    关于第二个例子,这是一个技巧,它使用了true==1/false==0这一事实。。。
    有趣的是,但我不想保留这些代码。

    花了多年时间优化软件,我敢打赌,你上面发布的小程序块并不是你真正的问题。我认为我们需要看到整个方法以及一些分析结果(当涉及到优化时,测量就是一切)来更好地处理它

    回答你自己的问题——选择每个选项,并对其进行分析,比如1000万次调用(仅1000次不会告诉你上述片段的任何内容)。这将告诉你哪种方法最有利于速度,没有必要进行二次猜测

    我的问题是:在手臂水平,哪一个更快


    为什么不编写一个简单的测试程序来测量每个块100000次调用的执行速度呢?

    没有区别,gcc将把一个简单的if和一个三元运算符编译成相同的代码。如果您真的试图在ARM asm级别优化代码,那么通过使用条件ARM asm代码来避免分支。但是,为了做到这一点,你需要分析你的代码并找出真正需要它的地方。然后,你只需要为代码中的热点手工编写ARM asm代码。基本上,如果你不需要极大的性能改进,那么只需使用编译器提供的功能作为compiler在大多数情况下都做得很好。

    离题……他询问编译器优化问题。三元表达式在不使用ab时也很好。请看这个问题>,我相信你知道,这样的优化效果最好在正确分析之后再决定。如果结果证明更具可读性的操作真的来了成本很高,那么只有测试才能确定这些微秒是否真的可以从三元运算中挤出。你做过一些严肃的游戏编程吗?特别是在嵌入式设备上(甚至可能在GPU的着色器上)?如果你调用一个代码1000次,你只需节省一毫秒就可以节省整整一秒。而这个代码的调用次数仅为1000次以上。这意味着如果XCode的ARM编译器生成一个分支,我真的可以节省很多!顺便说一句,我做了一个分析,而这个方法是个恶棍。这只是大量的数学和假设。对不起,你没有提到你在你的问题中已经描述过。你尝试过两者的构建来看看使用三元运算是否会有所不同吗?我也很抱歉。我的目标是找出编译器在该场景中的行为。这比测试反复试验更容易。请定义“更好”。这是我的“计算机体系结构101”中的内容老师:分支是邪恶的。它们通常强制管道刷新,使任何操作码前瞻失效。这是我的“最热”代码的一部分方法。它占用40%的CPU时间,每秒调用数千次,我需要为它添加很多功能。如果我可以通过将一个分支更改为乘法或三元运算来节省一微秒,我会这样做。这是否意味着“更好==更快”?如果是,请更新问题以避免模糊的“更好”并且使用更具体的“更快”。为什么标题仍然有模糊的“更好”?你能解释为什么吗?或者修复标题吗?我想你不明白。首先,我问编译器在这两种情况下会做什么-我不会自己编写ARM代码。其次,我告诉过代码名为“千”