2010-07-12 72 views
0

只是一个简单的问题在Java中哪些代码更昂贵?什么更昂贵?作业或声明?

double test = 5; 
    double test1 = 5; 

double test = 5; 
    double test1 = test; 
+0

最底部最后一行'test'和'1'之间的空格是错字,对吗? – 2010-07-12 11:12:45

+10

不成熟的优化...没关系:) – eljenso 2010-07-12 11:14:41

回答

19

都不是。 Java有一个非常好的优化器,它会导致在这个例子中生成完全相同的代码。

编译器查看作业double test1 = test;,可以发现在此时test是一个等于5的常量,并完全优化了分配。

这也是为什么你不应该害怕扩大了数值,即。

int timeout = 60 * 60 * 2 // 2 hours in seconds 

这完全放在一边,这是micro-optimisation非常多的情况下,将永远返回任何值得一提的。担心该网络连接会阻止几秒钟的工作。

+12

这甚至不是微型优化。我们需要像这样给一个新的术语。纳米优化也许? – 2010-07-12 11:15:37

+1

实际上'javac'不会优化它到完全相同的代码;我用Oracle Java 1.6.0 update 20测试了这个(用'javap -c'反编译)。 JIT可能会优化这一点。但是现在我同意这样的微观优化(几乎)是不值得花时间的。 – Jesper 2010-07-12 13:34:20

+0

@Jesper这很有趣,因为这是最基本的优化之一,我总是会听说java如何优化事物。 – 2010-07-12 21:28:26

3

两者之间的差异可以忽略不计。我想这个常数会更快一点,因为没有加载测试的价值,但真的......这不值得你花时间去担心它。可读性比您可能想到的节省的周期要重要得多。

0

我首先想到的是说,写一个小程序循环和测试。 但是,它可能比这更复杂。

Java可以做各种优化的东西,你写的代码了,这是哪门子的东西,他们重点关注。所以这很难回答,它可能取决于特定的JRE和代码。

虽然我明白,这是一个有趣的学术问题,在实际应用中,答案可能是“没有多大意义”你的代码的其他部分通常会做出更多的是瓶颈。

为了您的具体的例子,我有一种感觉,“5”可能是一个特例,那里是静态的整数的系统池,我知道他们做,与字符串。有人知道吗?

+1

一些JRE甚至会优化整个循环结构,如果它没有做任何有效的事情。 – 2010-07-12 11:26:53