即使底层 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