评论者: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"