3 回答

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊
診斷Java代碼:提高Java代碼的性能(alt)解釋了JVM不支持尾調(diào)用優(yōu)化的原因。
但是,盡管眾所周知如何將尾遞歸函數(shù)自動(dòng)轉(zhuǎn)換為簡單循環(huán),但Java規(guī)范并不要求進(jìn)行此轉(zhuǎn)換。據(jù)推測,不是要求的一個(gè)原因是,通常,轉(zhuǎn)換不能在面向?qū)ο蟮恼Z言中靜態(tài)地進(jìn)行。相反,從尾遞歸函數(shù)到簡單循環(huán)的轉(zhuǎn)換必須由JIT編譯器動(dòng)態(tài)完成。
然后給出了一個(gè)不會(huì)轉(zhuǎn)換的Java代碼示例。
因此,正如清單3中的示例所示,我們不能指望靜態(tài)編譯器在保留語言語義的同時(shí)對Java代碼執(zhí)行尾遞歸轉(zhuǎn)換。相反,我們必須依靠JIT的動(dòng)態(tài)編譯。根據(jù)JVM,JIT可能會(huì)也可能不會(huì)這樣做。
然后它給出了一個(gè)測試,您可以用它來確定您的JIT是否這樣做。
當(dāng)然,由于這是一篇IBM論文,它包含一個(gè)插件:
我用幾個(gè)Java SDK運(yùn)行了這個(gè)程序,結(jié)果令人驚訝。在Sun的Hotspot JVM上運(yùn)行版本1.3顯示Hotspot不執(zhí)行轉(zhuǎn)換。在默認(rèn)設(shè)置下,堆棧空間在我的機(jī)器上耗盡不到一秒鐘。另一方面,IBM的版本1.3的JVM沒有問題,表明它確實(shí)以這種方式轉(zhuǎn)換代碼。
添加回答
舉報(bào)