评论作者:mikera
我创建了一个小型修补程序,为 Reflector.getMethods 调用添加了非常简单的(固定大小,每种阶数1个元素)缓存。目的是使这个缓存非常简单,以避免并发效果和可变大小的缓存问题。
在反射调用同一方法的循环中,我的测试中有所改善(大约15-20%),这可能是人们真正关注反射性能的常见情况。
由于我认为大部分负担实际上是在 invokeMatchingMethod
上,因此性能确实可以进行进一步改进,但这是一个正交问题。这个修补程序为该区域进一步的性能优化打开了道路。
;; clojure 1.8.0-RC3
user=> (let (link: v (identity 1)) (time (dotimes (link: i 1000) (.doubleValue v))))
"Elapsed time: 1.598779 msecs"
;; 带有缓存阶数
user=> (let (link: v (identity 1)) (time (dotimes (link: i 1000) (.doubleValue v))))
"Elapsed time: 1.359888 msecs"