2009-06-03 169 views
1

我想知道如果有)爪哇優化

  1. 的String = someObject.toString之間的任何性能差異(;的System.out.println(一個或多個);

  2. 的System.out.println(someObject.toString());

看着生成的字節碼,它似乎有差異。 JVM是否能夠在運行時優化此字節碼以使兩種解決方案都能提供相同的性能?

在這個簡單的例子,當然解決方案2似乎更合適,但有時我寧願解決方案1可讀性目的,我只是想確保不引入表演中的關鍵代碼段「減少」。

回答

6

一個臨時變量(尤其是一些小如字符串)的創建是無關緊要的代碼的速度,讓您無需擔心這一點。

嘗試測量在這部分代碼中花費的實際時間,我打賭你會發現根本沒有性能差異。撥打toString()並打印出結果需要的時間比存儲臨時值所用的時間要長得多,我認爲您不會在此找到可衡量的差異。

即使字節碼看起來不同,這裏,是因爲javac是幼稚和你的JIT編譯器做繁重的你。如果這段代碼對於速度真的很重要,那麼它會被執行很多次,並且你的JIT將選擇它來編譯爲本地代碼。它們很可能都編譯爲相同的本地代碼。

最後,你爲什麼要在性能關鍵的代碼中調用System.out.println()?如果這裏有什麼會殺死你的表現的話,那會的。

+0

感謝您的回答。例如,println就在這裏(我必須承認這是一個糟糕的例子)。當然,我沒有在關鍵代碼部分使用它。 Manu – 2009-06-03 07:42:46

1

相比輸出到控制檯,我懷疑任何之間的性能差異將是可衡量的。在您測量並確認您遇到問題之前,請勿優化。

2

如果你有關鍵代碼段是要求高性能,避免使用System.out.println()。進行標準輸出所帶來的開銷比任何變量賦值都要多。

待辦事項解決方案1.

編輯:或解決方案2

2

沒有*代碼,以至於你的兩個樣本之間的差異使得任何差別的關鍵。我鼓勵你測試一下;運行幾百萬次,並記錄所花費的時間。

選擇更具可讀性和可維護性的表單。

*誇大其詞。如果你有足夠的代碼,你已經研究過它來學習這一點。

2

生成的字節碼是的給定的一段代碼的性能的很好的措施,因爲這字節碼將得到分析,優化,和(在服務器編譯器的情況下)重新分析和重新優化如果它被認爲是性能瓶頸。

如有疑問,請使用分析器。

+0

+1「for a profiler」 – 2009-10-30 15:22:51