请在 2024 年 Clojure 状态调查!分享您的想法。

欢迎!请查看 关于 页面以获取更多关于如何使用此软件的信息。

0 投票
Collections
即使底层 seq 包含缓存哈希,LazySeq 仍会每次都进行计算。


user=> *clojure-version*
{:major 1, :minor 7, :incremental 0, :qualifier "master", :interim true}
user=> (def a (range 100000))
#'user/a
user=> (time (hash a))
"计时:21.812 毫秒"
375952610
user=> (time (hash a))        ;; 哈希已缓存
"计时:0.036 毫秒"
375952610
user=> (def b (seq a))
#'user/b
user=> (time (hash b))
"计时:0.042 毫秒"   ;; 使用缓存哈希
375952610
user=> (def c (lazy-seq b))
#'user/c
user=> (time (hash c))        ;; 应使用底层哈希
"计时:27.758 毫秒"
375952610
user=> (time (hash c))        ;; 应使用底层哈希
"计时:17.846 毫秒"
375952610


Approach: 如果 LazySeq 实现了 IHashEq 所产生的 seq,则使用它来计算 hasheq()。
Patch: clj-1373.diff

5 答案

0 投票

评论者:wagjo

添加了一个补丁,该补丁检查底层 seq 是否实现了 IHashEq,如果是,则使用该哈希,而不是重新计算。

0 投票

评论者:alexmiller

在这个补丁中,您能否更新 else 情况(原始代码)以使用 s 而不是 this,这样就不需要重新调用 seq()?

0 投票

评论者:wagjo

添加了补丁(链接:^clj-1373-2.diff),用于重新使用 {{s}} 对 else 情况。

0 投票

评论者:alexmiller

第 -2 个补丁无法编译,所以我认为这是个糟糕的建议。 :)

0 投票
参考:[https://clojure.atlassian.net/browse/CLJ-1373](https://clojure.atlassian.net/browse/CLJ-1373)(由 wagjo 报告)
...