Clojure懒惰结构与哈希/集/向量的表现?

Zub*_*air 6 clojure

我正在使用Clojure数据结构,但我没有使用任何懒惰的评估.在所有地方使用懒惰结构会有性能损失吗?

pmd*_*mdj 4

从源代码来看:

clojure.lang.Cons(严格的列表元素,clojure.lang.PersistentList非常相似),https://github.com/clojure/clojure/blob/1.2.0/src/jvm/clojure/lang/Cons.java#L34

public Object first(){
    return _first;
}
Run Code Online (Sandbox Code Playgroud)

clojure.lang.LazySeq(惰性序列元素),https://github.com/clojure/clojure/blob/1.2.0/src/jvm/clojure/lang/LazySeq.java#L77

public Object first(){
    seq();
    if(s == null)
        return null;
    return s.first();
}
Run Code Online (Sandbox Code Playgroud)

在哪里

final synchronized Object sval(){
    if(fn != null)
        {
        try
            {
            sv = fn.invoke();
            fn = null;
            }
        catch(Exception e)
            {
            throw new RuntimeException(e);
            }
        }
    if(sv != null)
        return sv;
    return s;
}

final synchronized public ISeq seq(){
    sval();
    if(sv != null)
        {
        Object ls = sv;
        sv = null;
        while(ls instanceof LazySeq)
            {
            ls = ((LazySeq)ls).sval();
            }
        s = RT.seq(ls);
        }
    return s;
}
Run Code Online (Sandbox Code Playgroud)

所以你肯定是要付出代价的。这在很大程度上取决于每个特定的用例,该价格对您的影响有多大,以及它是否被延迟评估为您节省的内存和减少浪费的计算所抵消。