我是Clojure的新手,具有以下简单功能
(defn find-func
[what seq]
(filter #(.equals what %) seq)
)
我注意到上述功能比用=代替.equals时要慢得多,如下所示:
(defn find-func
[what seq]
(filter #(= what %) seq)
)
当我在jdk 1.8.0_25,clojure 1.8上从REPL运行它时,我观察到了它:
(find-func "10" (map str (range 0 800000)))
为什么呢?我虽然从另一个stackoverflow答案(堆栈溢出问题)=调用.equals,所以应该没有任何性能差异。从那个时候开始优化了吗?谢谢您的澄清。
问题在于您的第一个find-func
使用反射,而第二个不使用反射:
(set! *warn-on-reflection* true)
(defn find-func [what seq]
(filter #(.equals what %) seq))
;; Reflection warning, foo.clj:2:12 - call to method equals can't be resolved (target class is unknown).
(defn find-func [what seq]
(filter #(= what %) seq))
如果添加类型提示以避免反射,.equals
它将比=
:
(defn find-func [^Object what seq]
(filter #(.equals what %) seq))
Clojure应该能够自己解决这个问题,但是由于某种原因,它没有。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句