评论者: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 msecs"
;; 带有缓存arity
user=> (let (link: v (identity 1)) (time (dotimes (link: i 1000) (.doubleValue v))))
"消耗时间:1.359888 msecs"