2009-04-29 63 views
6

No我應該看看java編譯器產生的字節碼嗎?

  • JIT編譯器可以「改造」的字節碼轉換爲完全不同的東西反正。
  • 它會導致你做過早的優化。

Yes

  • 你不知道哪種方法將由JIT編譯,所以它是更好,如果你優化他們所有。
  • 它會讓你成爲更好的Java程序員。

我問沒有真正知道(顯然),所以隨時重定向到JIT超鏈接。

回答

17

是的,但在一定程度上 - 這是一個很好的教育機會,可以看到底下發生了什麼,但可能應該適度地進行。

它可能是一件好事,因爲查看字節碼可能有助於理解Java源代碼如何編譯爲Java字節碼。此外,它可能會提供一些有關編譯器將執行的優化類型的一些想法,也可能對編譯器可以執行的優化量有一些限制。

例如,如果執行一個字符串連接,javac將優化級聯成使用StringBuilder以及執行append方法來串聯String秒。

然而,如果字符串連接在循環進行的,一個新的StringBuilder可以在每次迭代實例化,從而可能導致性能下降相比手動實例化所述環之外的StringBuilder並且僅在循環內執行append

關於JIT的問題。即時編譯將會是JVM實現特定的,因此當字節碼轉換爲本地代碼時,發現字節碼的實際情況並不容易,而且,我們也無法確定哪些部分(至少不是沒有一些特定於JVM的工具來查看正在執行什麼類型的JIT編譯 - 我不知道這方面的任何細節,所以我只是猜測)。

也就是說, JVM無論如何都要執行字節碼,它的執行方式對開發者來說或多或少都是不透明的,而且還是JVM特有的。一個JVM可能會執行一些性能技巧,而另一個則不會。

當涉及到查看生成的字節碼的問題時,它涉及到了將源代碼編譯爲字節碼時實際發生的情況。能夠看到編譯器執行的各種優化,但也瞭解編譯器可以執行優化的方式有限。所有這一切說的,我認爲這是一個非常好的想法,成爲癡迷字節碼生成,並試圖編寫程序,將發出最優化的字節碼。更重要的是編寫可被其他人閱讀和維護的Java源代碼。

4

這完全取決於你想要做什麼。如果你想優化一個方法/模塊,看字節碼會浪費你的時間。始終首先查找瓶頸,然後優化瓶頸。如果你的瓶頸看起來儘可能嚴密,並且你需要加快速度,那麼你可能別無選擇,只能用本地代碼重寫並使用JNI接口。

嘗試優化生成的字節碼將沒有多大的幫助,因爲JIT編譯器會做很多工作,並且您不會對它的具體操作有很多想法。

1

我不這麼認爲。由於不必調試javac編譯器或想知道是否感興趣,我想不出爲什麼有人會關心生成字節碼的原因。

知道字節碼不會讓你成爲一個更好的Java程序員,而不是知道內燃機如何工作會使你成爲更好的驅動程序。

從抽象的角度思考。在計算行星軌道時,你不需要知道夸克或原子的行爲。要成爲一名優秀的Java程序員,你應該學習......呃Java。是的,Java,就是這樣:-)

+0

但是一旦他了解到汽車內部構件,科爾特洛克就成了一個更好的車手。 – Boune 2009-04-29 13:33:49

0

除非您正在開發某種高容量服務器,否則除了出於好奇之外,您可能永遠不需要檢查字節碼。遵循組織中可接受編碼實踐的源代碼將爲大多數應用程序提供充足的性能。

不要爲性能擔心,除非在加載測試應用程序後發現問題(或者整個客戶服務部門抨擊您,因爲該屏幕需要「永久」加載)。然後,消除瓶頸,只留下其餘的代碼。

字節碼需要一個適度的學習曲線來理解。當然,學習更多東西並不會讓人感到痛苦,但實用主義建議在需要的時候才推遲。 (如果那一刻來臨,我建議找個人來指導你。)

+0

檢查字節碼很少會告訴你性能。 (javac在做什麼高級別的例外 - 字符串連接和裝箱)。 – 2009-04-29 11:24:43

相關問題