据我了解,当您使用以下表达式创建新列表时,Erlang不会复制L1
,而只会复制H
。
L2 = [H|L1]
Erlang是否具有dict
的持久性数据结构(请参阅Persistent data structure),也就是说,当您在树中添加/删除/修改节点时,只复制了少数元素(如{{} 3}})?
答案 0 :(得分:12)
使用[H|T]
构建列表时,您误解了这种情况。正如您所说,T
未被复制,但H
也未被复制。所有发生的事情都是T
前面有一个新的列表单元格,其中H
为其头部(尾部为T
)。使用列表时,创建的唯一位是实际列表单元格,而不是每个单元格中的数据。
使用dict
时会发生同样的情况。在dict
中修改(添加/删除元素)时,仅修改实际的dict
结构,而不修改dict
中的实际数据。此外,它很聪明,只能复制dict
结构,以便进行修改。
所以,是的,Erlang拥有持久的数据结构。在这方面,clojure就像Erlang(我们在它之前就已经很久了)。
答案 1 :(得分:2)
根据我的经验,库模块的数据结构在性能或内存压力变大时不会降低。
对于dict,它使用动态哈希表作为内部数据结构,并且工作基本上仅在完成修改的存储桶上完成。
我还查看了我发现评论的gb_trees
模块:
行为是对数的(应该是)。
而且gb_trees
通常非常快,所以我很确定没有太多的复制正在进行。
通常,如果您使用Erlang等语言实现这些数据结构,则需要处理复制问题,因此无需担心通用库函数。
我重读了有关持久性数据结构的文章:就本文而言,Erlang的数据结构是完全持久的,也是一种持久的持久性。