Objective c 哪个更快,做两次浮点减法,还是做一次浮点减法,存储结果,然后使用存储的结果?

Objective c 哪个更快,做两次浮点减法,还是做一次浮点减法,存储结果,然后使用存储的结果?,objective-c,performance,Objective C,Performance,我的程序中有一段代码需要尽可能快地执行。我需要在其中减去两个double,我需要在这段代码中使用减法的结果两次。将结果存储在一个变量中并使用该变量两次会更快吗?还是只做两次减法会更快。以下是我在伪代码中的意思,其中x和y是双精度: 我应该这样做: double difference = x - y; if(difference >= 10.0) return 0; else return tan(difference); 或者这个: if((x-y) >= 10.0

我的程序中有一段代码需要尽可能快地执行。我需要在其中减去两个double,我需要在这段代码中使用减法的结果两次。将结果存储在一个变量中并使用该变量两次会更快吗?还是只做两次减法会更快。以下是我在伪代码中的意思,其中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。谢谢。

很有可能优化器会“看到”您正在做什么,并优化第二个代码段以匹配第一个代码段。这种优化技术称为

此外,优化器很可能在调用
tan
时使用寄存器中的值来完全消除
差异
变量

在没有优化的情况下,答案取决于
x
s和
y
s的混合:如果有很大一部分没有调用
tan
,那么第二个代码片段会稍微快一点。如果大多数对都是调用
tan
,那么性能将主要由调用
tan
来控制,这比存储
浮点值的单个减法或单个指令要慢得多两件事:
1.内存引用很慢。

2.编译器很聪明。

让我们分析一下您的代码,它的执行时间仅仅是基本操作的计数。此模型的基本操作包括:

  • 给变量赋值
  • 调用方法
  • 执行算术运算
  • 比较两个数字
  • 索引到数组中
  • 从方法返回
现在在此基础上分析两个代码。对于第一个代码,基本操作的编号为

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


这两种代码的性能是相同的。

我严重怀疑这种事情会对应用程序的性能产生任何明显的影响。如果你真的很担心它,在上面放一个分析器,然后做一个测试。您应该更喜欢易读的代码,而不是担心这种微不足道的性能问题。您考虑的是过早的优化,不要这样做。除非你正在做数百万,否则只需做最简单最清楚的事情:重新计算。稍后使用仪器确定什么是性能问题。其中任何一个都比浪费时间和带宽问这个问题要快。这个问题似乎离题了,因为它是关于吹毛求疵。是的,我们在70年代曾在汇编语言程序上这样做过,但您缺少编译器优化和两个分支的执行组合,以及x&y赋值的方式和位置,以及许多其他变量。@Zaph;但这些优化技术大多基于RAM计算模型(RAMCM)。我认为RAMCM的结果与优化器得到的结果差别不大。实际上,两者生成的汇编代码都是使用option-Ofast编译的。