2024 Clojure状态调查中分享您的想法!

欢迎!请查阅关于页面以了解如何工作的一些更多信息。

0
集合
即使基础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


*方法:* 如果LazySeq实现的IHashEq生成的seq,则使用它来计算hash。
*补丁:* 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 提报)
...