评论者: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))))
"执行时间:1.598779毫秒"
;; 使用缓存的arity
user=> (let (link: v (identity 1)) (time (dotimes (link: i 1000) (.doubleValue v))))
"执行时间:1.359888毫秒"