评论者:mikera
我创建了一个小的修复程序,为 Reflector.getMethods 调用添加了非常简单的(固定大小,每个算术表达式一个元素)缓存。目的是保持它非常简单,以避免并发影响和可变大小缓存等问题。
这在我对在循环中调用相同方法进行反射的测试中帮助不大(大约 15-20%),这可能是人们真正关心反射性能的典型场景。
由于我认为大部分开销实际上是在 invokeMatchingMethod
上,所以性能还可以进一步提高。但这是一个独立的议题。此修复程序为该领域进一步性能优化开启了道路。
;; clojure 1.8.0-RC3
user=> (let ((v (identity 1)) (time (dotimes (i 1000) (.doubleValue v))))
"已用时间:1.598779 毫秒"
;; 使用缓存的算术表达式
user=> (let ((v (identity 1)) (time (dotimes (i 1000) (.doubleValue v))))
"已用时间:1.359888 毫秒"