函數調用底層的底層操作是什麼?Clojure是否爲每個函數調用重複啓動新的類(對象)?
當我們從Clojure調用一個函數時會產生什麼樣的Java代碼?
我想知道它的細節,所以我可以寫更多的性能爲重點的代碼。
函數調用底層的底層操作是什麼?Clojure是否爲每個函數調用重複啓動新的類(對象)?
當我們從Clojure調用一個函數時會產生什麼樣的Java代碼?
我想知道它的細節,所以我可以寫更多的性能爲重點的代碼。
在clojure中,作爲函數調用的任何東西都必須實現clojure.lang.IFn
接口。該界面包含稱爲invoke
的重載方法。函數在Clojure中名列前茅,所以當你說(def square (fn [x] (* x x)))
時,square
被分配給實現IFn
的類的實例。
所以總結一下:在Clojure中調用一個函數會導致在一個對象上調用一個方法的代價。
Clojure功能實現the IFn
interface,它提供了帶有許多不同簽名的invoke()
調用。除非傳遞超過20個參數,否則在使用可變參數簽名的情況下,它與JVM中任何其他方法調用一樣快。
每個函數**定義**,不是每個函數**調用**。函數調用只是一個函數調用,沒有什麼不同之處。 –