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

伏塔

我是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,所以应该没有任何性能差异。从那个时候开始优化了吗?谢谢您的澄清。

山姆·埃斯特普(Sam Estep)

问题在于您的第一个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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么Boost:Format和printf在相同格式字符串上的行为不同

为什么列表和字符串上的方法在python中的工作方式不同

为什么通过在空字符串和仅包含分隔符的字符串上调用split()来获得大小不同的数组

为什么用户定义的字符串文字和整数文字具有不同的行为?

为什么〜=在枚举和字符串上不起作用?

为什么在这个 Base 64 字符串上的 Safari 和 Chrome 中 atob 会失败?

为什么`-lt`对于字符和字符串的行为有所不同?

为什么查询字符串的 = 和 & 没有编码?

不同的库具有不同的结果和性能

为什么使用 concat 函数创建的 2 个字符串和相同的字符串具有不同的对象引用?

为什么不同整数大小的数组具有不同的性能?

如何显示具有字符限制和包机限制的字符串在php中排除该字符串上的空间

如果字符串上没有逗号,为什么$ aliasArr总是数组?

为什么[[-z]]和[[-v]]具有不同的语法?

为什么GeneratorExit和StopIteration具有不同的基类?

为什么conj和cons具有不同的参数顺序

他们为什么有系统字符串和标准字符串

为什么Linux发行版具有不同的性能?

为什么两种类型在科特林ReadFile和字符串之间有什么不同?

为什么unordered_map和map具有相同的性能?

在字符串上使用cstring有什么好的方案?

为什么-1j和0-1j变成不同的字符串?

String::from() “o”和“ó”的字符串文字长度不同。为什么?

为什么我用.concat()和+ =用Java字符串得到不同的输出?

为什么Unicode字符串在Python 2和3中占用的内存不同?

为什么%p和%x的格式在格式字符串中不同?

为什么JavaScript用字符串和int评估加号会不同?

为什么json查询字符串的'axios'和$ http(vue-resource)行为不同?

在解组JSON时,为什么对字符串和[] bytes进行不同的处理?