簡體   English   中英

我應該查看java編譯器生成的字節碼嗎?

[英]Should I look at the bytecode that is produce by a java compiler?

No

  • 無論如何,JIT編譯器可以將字節碼“轉換”為完全不同的東西。
  • 它會引導你做過早的優化。

Yes

  • 您不知道JIT將編譯哪種方法,因此如果您優化它們會更好。
  • 它將使您成為更好的Java程序員。

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

是的,但在某種程度上 - 作為一個教育機會,看看幕后發生了什么是好的,但可能應該適度地完成。

這可能是一件好事,因為查看字節碼可能有助於理解如何將Java源代碼編譯成Java字節碼。 此外,它可能會給出一些關於編譯器將執行何種優化的想法,以及編譯器可以執行的優化量的一些限制。

例如,如果執行字符串連接, javac將優化連接以使用StringBuilder並執行append方法來連接String

但是,如果在循環中執行字符串連接,則可以在每次迭代時實例化新的StringBuilder ,與在循環外手動實例化StringBuilder並僅在循環內執行append s相比,可能導致性能下降。

關於JIT的問題。 即時編譯將特定於JVM實現,因此在將字節碼轉換為本機代碼時,找出字節碼實際發生的情況並不容易,而且,我們無法分辨哪些部分是JITted(至少沒有一些特定於JVM的工具,看看正在執行什么樣的JIT編譯 - 我不知道這個領域有什么細節,所以我只是在猜測。)

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

當涉及到查看生成的字節碼的問題時,它歸結為在編譯為字節碼時學習源代碼實際發生的事情。 能夠看到編譯器執行的各種優化,但也了解編譯器可以執行優化的方式有限。

總而言之,我不認為對字節碼生成過敏並試圖編寫將發出最優化字節碼的程序是一個非常好的主意。 更重要的是編寫其他人可讀和可維護的Java源代碼。

這完全取決於你想要做什么。 如果您正在嘗試優化方法/模塊,查看字節代碼將浪費您的時間。 始終首先分析您的瓶頸所在,然后優化瓶頸。 如果您的瓶頸看起來盡可能緊,並且您需要加快速度,那么您可能別無選擇,只能在本機代碼中重寫它並與JNI進行交互。

嘗試優化生成的字節碼將沒有多大幫助,因為JIT編譯器將做很多工作,並且你不會對它正在做什么有太多的了解。

我不這么認為。 除了必須調試javac編譯器或想要知道感興趣之外,我想不出有人為什么會關心生成什么字節碼的一個很好的理由。

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

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

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

在對應用程序進行負載測試之后發現問題(或者整個客戶服務部門為您完成“永久”加載的屏幕時,您不會擔心性能問題)。 然后,錘擊瓶頸並將剩下的代碼單獨留下。

字節碼需要適度的學習曲線才能理解。 當然,學到更多東西永遠不會傷害,但實用主義建議在必要時將其推遲。 (如果那一刻到來,我建議找人來指導你。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM