哪个更快,执行浮点减法两次或执行浮点减法一次,存储结果,然后使用存储的结果?

时间:2014-05-29 15:06:07

标签: objective-c performance

我的程序中有一段代码需要尽快执行。我有两个双打需要在其中减去,我需要在这段代码中使用两次减法的结果。将结果存储在变量中并使用变量两次会更快,或者只是两次进行减法会更快。这就是我在伪代码中的意思,其中x和y是双精度:

我应该这样做:

double difference = x - y;
if(difference >= 10.0)
    return 0;
else
    return tan(difference);

或者这个:

if((x-y) >= 10.0)
    return 0;
else
    return tan(x-y);
如果你能告诉我是否>

奖励积分比较明显快于> =比较。它不太可能x-y将完全是10.0,所以我可以选择>如果那会更快。这是针对iPhone应用程序的Objective-C。感谢。

3 个答案:

答案 0 :(得分:2)

很有可能优化器会"看到"您正在做什么,并优化第二个代码段以匹配第一个代码段。此优化技术称为Common Subexpression Elimination

此外,优化器很可能完全消除difference变量,使用tan调用中寄存器的值。

在没有优化的情况下,答案取决于xy s的混合:如果有一个重要部分未调用tan,则第二个片段将是稍快一些。如果大多数对都是这样调用tan,性能将由tan的调用支配,这比单个减法或单个指令存储float要慢得多

答案 1 :(得分:2)

让我们在RAM computational model上分析您的代码,其中执行时间只是原始操作的计数。该模型的原始操作是:

  
      
  • 为变量分配值
  •   
  • 调用方法
  •   
  • 执行算术运算
  •   
  • 比较两个数字
  •   
  • 索引到数组
  •   
  • 从方法返回
  •   

现在在此基础上分析您的两个代码。对于您的第一个原始操作代码是

double difference = x - y;  --------> 2
if(difference >= 10.0)      --------> 1
    return 0;               --------> 1
else
    return tan(difference); --------> 2 + p (primitive operations in tan function)  

6+p
在第二个代码中

 if((x-y) >= 10.0)          --------> 2
    return 0;               --------> 1
else
    return tan(x-y);        --------> 3 + p  

原始操作的数量为6+p

两个代码的性能都是一样的。

答案 2 :(得分:0)

两件事:
 1.记忆参考很慢  2.编译器很聪明。