通过创建新变量来表现

时间:2011-05-05 08:19:02

标签: java optimization jvm runtime

我想尽可能地编写我的java程序,因为我可以减少一切以获得最佳性能......在程序中,一个方法将调用apprx。 900万次。在那里我必须计算一些东西,只需减去两个整数,这些都需要两次。 所以我的问题是,什么是更快:用计算结果初始化新整数或只计算两次值? e.g:

int result = a-b;
methodToCall(result, foo, bla);
otherMethod(result, bla, foo);

methodToCall(a-b, foo, bla);
otherMethod(a-b, bla foo);

我无法直接看到差异,但有时它的第一种方法更快一点...... 一般来说:第一种方法总是更好吗?例如,当使用其他类型的计算时(更复杂)。 java编译器或jvm是否正在使用它来优化它,例如看到我做了两次相同的计算,只进行一次并自己缓存结果?

3 个答案:

答案 0 :(得分:4)

第一个理论上会更快。

在第二种情况下,JVM不仅会计算a-b两次,而且还会在将结果传递给两个方法调用之前暂时为结果分配两次存储。

我刚刚对这些案例进行了1亿次测试,并且他们之间只有10-15ms的差异,第一次更快。我的测试结果会因为a和b是常数而倾斜,但它似乎证实了这一理论。

答案 1 :(得分:3)

只需测量时间。在不了解事实的情况下,您无法做出任何结论。 请参阅this有关工具的问题。

如果差异很难被注意到,那么总是喜欢读得很好的代码。

答案 2 :(得分:1)

JVM可以优化第二种情况下的代码,就像第一种情况一样。但是,如果不是这样,它可能花费你1个时钟周期,可能是大约3毫秒(如果你在3 GHz处理器上称它为900万次)

我更喜欢第一种形式,因为它减少了重复,这使我更容易阅读。如果你的表达更昂贵,它可能会产生更大的不同。