即使底层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实现的seq生成器实现了IHashEq,则使用它来计算hasheq()。
*补丁:clj-1373.diff