评论人:mikera
我创建了一个小的补丁来添加非常简单的(固定大小,每个arity一个元素)缓存,用于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毫秒”
;; 使用缓存的arity
user=> (let (link: v (identity 1)) (time (dotimes (link: i 1000) (.doubleValue v))))
“经过时间:1.359888毫秒”