我的程序中有一段代码需要尽快执行。我有两个双打需要在其中减去,我需要在这段代码中使用两次减法的结果。将结果存储在变量中并使用变量两次会更快,或者只是两次进行减法会更快。这就是我在伪代码中的意思,其中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。感谢。
答案 0 :(得分:2)
很有可能优化器会"看到"您正在做什么,并优化第二个代码段以匹配第一个代码段。此优化技术称为Common Subexpression Elimination。
此外,优化器很可能完全消除difference
变量,使用tan
调用中寄存器的值。
在没有优化的情况下,答案取决于x
和y
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.编译器很聪明。