评论者:mikera
我创建了一个小补丁,为 Reflector.getMethods 调用添加非常简单的(固定大小,每个参数个数一个元素)缓存。目的是保持这个极其简单,以避免并发效应和可变大小缓存的问题。
这在我的测试中(在循环中调用相同方法大约 15-20%)帮了一点点忙,这可能是人们真正关心反射性能的常见情况。
由于我认为大部分开销实际上是在 invokeMatchingMethod
中,因此性能还有改进的余地。但是,这是一个独立的议题。此补丁为该区域的进一步性能优化开辟了道路。
;; clojure 1.8.0-RC3
user=> (let (link: v (identity 1)) (time (dotimes (link: i 1000) (.doubleValue v))))
"执行时间:1.598779 毫秒"
;; 使用缓存的参数数量
user=> (let (link: v (identity 1)) (time (dotimes (link: i 1000) (.doubleValue v))))
"执行时间:1.359888 毫秒"