gpt4 book ai didi

string - Clojure:为什么字符串上的 = 和 .equals 有不同的性能?

转载 作者:行者123 更新时间:2023-12-01 10:33:58 26 4
gpt4 key购买 nike

我是 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 答案 ( Stack overflow question ) 中 = 调用 .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 应该能够自己解决这个问题,但由于某些原因它不能。

关于string - Clojure:为什么字符串上的 = 和 .equals 有不同的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38933661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com