2013-02-24 99 views
0

我將Robert Hundt的Havlak基準測試Java代碼移植到Groovy中(請參閱link)。現在我使用Groovy 2.1.1來運行基準測試,但是計算所需的持續時間幾乎相同。我做了什麼來啓用調用動態?我將groovy-2.1.1 \ indy中的groovy--indy.jars複製到groovy-2.1.1 \ lib。然後我刪除了groovy-2.1.1 \ lib所有的groovy .jars沒有「indy」的名字。此後,在IntelliJ IDEA中,我啓用並禁用了標誌文件>設置>編譯器> Groovy編譯器>調用動態支持。在什麼情況下,我們可以預期Groovy2.0 +會提高動態性能?

我只是說這讓人們看到我是否正確地打開indy支持。但這不是我的問題。我的問題是,在什麼樣的情況下,我們可以期待加快計算時間,因爲調用動態。我閱讀了關於它的文章,但是很難將在那裏解釋的關於動態調用的內容翻譯成「這種代碼將在indy支持下更快執行」的語句。 Havlak基準測試通過調用setter來改變值的循環。

如果有人對此事有所瞭解,我會很高興在這裏下載一些解釋:-)。

感謝,奧利弗

回答

1

我認爲主要是加速比invokedynamic的,當你使用某種鴨打字會。

invokedynamic API是針對JVM上動態方法分派的語言編寫的。 Groovy當然就是其中之一。但是如果你使用動態調度的方法,它只能使用indy。我可以給你一個例子,如果你需要的話。

但是我分析了Groovy中的indy dispatch功能,它似乎只是將舊的動態分派函數打包到其方法句柄中。事實上,如果真的這樣做,它不會更快。 在我看來,invokedynamic的Groovy實現目前尚未優化。

+0

Groovy中總是做動態調度,除非原始優化路徑採取的,這是隻有在運行時可以影響特定的條件下進行。 – blackdrag 2013-03-07 09:40:23

+0

是的,它總是做動態調度。如果您多次使用某個方法,那麼我所調用的invokedynamic只能加速執行。好吧,幾乎每個程序都是正常的情況,但應該考慮它 – Thorben 2013-03-15 12:02:52

+0

。當通話被引導並且被鏈接到一個通知的MethodHandle時,加速就會發生。然後,您可以重新使用MethodHandle,直到出現變化。 如果沒有indy,並且在腳本語言的實現中沒有緩存技術等,調度將發生在每個單一的方法調用中。 也許這有幫助。 – Thorben 2013-03-15 12:13:54

0

簡短回答: 使用一個類別。如果你的代碼在使用的時候確實慢得多,那你就不用indy了。

較長的答案: 如果你可以的地方張貼代碼,我可以分析它

相關問題