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