2011-01-27 78 views
6

爲Android設備開發遊戲,我需要針對沒有JIT的設備,而只依賴字節碼優化。我不知道這些優化的集合是否爲空...Java優化:僅字節碼vs JIT

其實,java編譯器(硬件,javac,不是JIT)是否會進行任何優化,如將/ 4轉換爲>> 2?或者每個優化都是針對JIT的一項工作?

+0

分區與左移對整體編程速度沒有任何影響。沒有絲毫的一點。 – delnan 2011-01-27 15:18:39

回答

7

標準的Java編譯器做了的一些優化,但它將大部分留給了JIT。

JIT知道程序在哪個處理器上正在運行,並且還可以訪問運行時信息,因此它可以執行比Java編譯器提前做的更多的優化。此外,事先進行大量優化可能會使字節代碼有些「混淆」,使得JIT難以對其進行優化。

我不知道Google的編譯器在將Java字節碼轉換爲Dalvik代碼時會做什麼 - 它可能會進行更廣泛的優化。

也許這個工具對您有用:Dalvik Optimization and Verification With dexopt

順便問一下,你提到的例子並不總是有效;不能保證將a/4轉換爲a >> 2可以使您的程序在任何處理器上運行得更快。我曾經在某處讀過一篇文章(對不起,現在找不到它......),它解釋了(我認爲)現代x86處理器,a >> 2甚至可能比a/4慢。

在任何情況下,都不要過早優化,例如在源代碼中手動將a/4改爲a >> 2,除非您有確實的證據(從性能測量結果)確實值得這樣做。

+0

謝謝(你們倆)。我沒有真正進行任何微型優化,我喜歡簡單的可讀性,但只是想知道沒有JIT的設備會遭受每一個可能的罪,或者如果編譯器做了微不足道的優化。正如你所提到的,我的例子並不是那麼簡單......是一個糟糕的例子。 – 2011-01-27 16:39:45

2

如果你的執行平臺真的在執行字節碼,那麼你對a/4a >> 2更快的直覺很可能是錯誤的。你需要做一些認真的應用程序分析要弄清楚:

  • 是否值得優化可言,
  • 那裏集中你的努力,
  • 什麼(微)優化實際工作。

FWIW,javac編譯器不太可能嘗試對算法進行微優化。最佳的本地代碼取決於實際執行平臺的硬件,如果javac試圖優化字節碼,它很可能使JIT編譯器的任務更加困難。