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