2011-08-17 66 views

回答

3

如果您運行的是像HotSpot這樣的JVM,它會進行機會性的JIT編譯,只關注頻繁執行的代碼。它通過計算每個代碼塊的頻率(或方法 - 我不確定哪個代碼)來確定要優化的代碼。因此,在啓動時,一切都被解釋。

這樣做的目的是通過只需要優化一小部分代碼就可以實現更積極和昂貴的優化。

+0

我認爲kmdent問的是爲什麼不編譯即使是很少的代碼段 –

+0

@Zach L:我剛剛修改了我的問題。 –

5

這是權衡所有問題

  • 編譯+執行代碼可以比時間更長的時間來解釋一次花費的時間
  • 你經常可以更有效地優化的事情,如果你有分支統計等
  • 有些東西是不能被編譯(任何不RTTI,可能)
  • 有些事情你不想編譯(行號的堆棧跟蹤等)
  • 我河畔還有其他的。
1

主要有兩個原因:

  • 解釋是,如果代碼只跑了幾次不慢。如果編譯只運行幾次,編譯成本比解釋代碼要昂貴得多。
  • 雖然解釋它有可能在運行時收集統計信息,以後用於優化代碼。例如,您可以計算特定分支的使用次數,並優化代碼以使更頻繁的情況更快。這種技巧可以使JIT編譯比提前編譯(它沒有機會利用運行時統計信息)更好

因此,Java JIT採取了一種明智的策略:直到不編譯您會發現相同的代碼正在多次運行,此時您有證據表明編譯可能是值得的,並且您可以進行一些額外的優化。

相關問題