ETS、perpetitive_term 和流程字典之间有什么区别?

rad*_*row 3 erlang ets data-structures

我知道(至少)有三种方法可以在 Erlang 中实现可变状态:

  • 碳排放交易体系表
  • persistent_term
  • 处理字典

它们的基本用法与我看起来非常相似:

% ETS
1> ets:new(table1, [named_table]).
2> ets:insert(table1, {thing}).
3> ets:lookup(table1, thing).
[{thing}]

% persistent_term
1> persistent_term:put(table2, thing).
2> persistent_term:get(table2).
thing

% Process dictionary
1> put(table3, thing).
2> get(table3).       
thing
Run Code Online (Sandbox Code Playgroud)

使用其中一种与另一种有什么区别和优缺点?

我发现 ETS 的行为更像是映射,但它与将映射保存在persistent_terms 或过程字典中有何不同?

Jos*_*é M 7

persistent_termets公开类似的 API,但它们是不同的,我将引用手册

持久术语是一项高级功能,并不是 ETS 表的一般替代品。

差异在于术语存储在何处以及更新时发生的情况,ETS 术语在读取时复制到进程堆,其中persistent_term术语仅被引用。这导致当更新其中的项目时persistent_term,拥有该术语的副本(引用)的所有进程都需要将其实际复制到堆中才能继续使用它。

对于大量的术语,引用它们而不是复制它们可以节省大量时间,但更新的惩罚是严厉的。

此外,persistent_term它只是一个映射,而 ETS 可以是集合、有序集、包或重复包,ETS 也提供选择和匹配语义。

persistent_term被用作 ETS 所使用的非常具体的用例的优化替代品。

关于进程字典,它是#{}进程内部的本地字典,始终可用。ETS 和persistent_term可用于每个进程,本地进程字典对于每个进程都是不同的。使用进程字典时要非常小心,因为它会影响可读性。