2010-07-12 67 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