爲Android設備開發遊戲,我需要針對沒有JIT的設備,而只依賴字節碼優化。我不知道這些優化的集合是否爲空...Java優化:僅字節碼vs JIT
其實,java編譯器(硬件,javac,不是JIT)是否會進行任何優化,如將/ 4轉換爲>> 2?或者每個優化都是針對JIT的一項工作?
爲Android設備開發遊戲,我需要針對沒有JIT的設備,而只依賴字節碼優化。我不知道這些優化的集合是否爲空...Java優化:僅字節碼vs JIT
其實,java編譯器(硬件,javac,不是JIT)是否會進行任何優化,如將/ 4轉換爲>> 2?或者每個優化都是針對JIT的一項工作?
標準的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
,除非您有確實的證據(從性能測量結果)確實值得這樣做。
謝謝(你們倆)。我沒有真正進行任何微型優化,我喜歡簡單的可讀性,但只是想知道沒有JIT的設備會遭受每一個可能的罪,或者如果編譯器做了微不足道的優化。正如你所提到的,我的例子並不是那麼簡單......是一個糟糕的例子。 – 2011-01-27 16:39:45
如果你的執行平臺真的在執行字節碼,那麼你對a/4
比a >> 2
更快的直覺很可能是錯誤的。你需要做一些認真的應用程序分析要弄清楚:
FWIW,javac
編譯器不太可能嘗試對算法進行微優化。最佳的本地代碼取決於實際執行平臺的硬件,如果javac試圖優化字節碼,它很可能使JIT編譯器的任務更加困難。
分區與左移對整體編程速度沒有任何影響。沒有絲毫的一點。 – delnan 2011-01-27 15:18:39