评论者:mikera
我创建了一个小的补丁,为Reflector.getMethods调用添加一个非常简单的(固定大小,每个arity有一个元素)缓存。目标是保持这个方案非常简单,以避免并发影响和可变大小缓存等问题。
在我的测试中,这有助于少一点(大约15-20%)在循环中调用同一个方法时的反射性能,这可能是人们真正关心反射性能的常见情况。
由于我认为大部分开销实际上是在invokeMatchingMethod
中,因此可以进一步提高性能,但这是一个独立的问题。这个补丁为该领域的进一步性能优化开辟了道路。
;; clojure 1.8.0-RC3
user=> (let (link: v (identity 1)) (time (dotimes (link: i 1000) (.doubleValue v))))
"Elapsed time: 1.598779 msecs"
;; with cached arities
user=> (let (link: v (identity 1)) (time (dotimes (link: i 1000) (.doubleValue v))))
"Elapsed time: 1.359888 msecs"