Chr*_*ian 13
ETS不是垃圾收集的,因为它存储在erlang进程之外的堆中.这意味着当你把东西放入ets时会被复制到它中,当你把它拿出来时,你会在你的过程中得到一份副本.然后进行大量的ets查找会导致过程中出现过多的问题(但这只适用于非常高的吞吐量).
进程字典是垃圾收集的.它存储在进程自己的堆中.因此,当您查看其中的内容时,您将获得与您放入的完全相同的值的引用.存储在流程字典中的值不会被压缩.
两种方法都是非纯的,即它们具有副作用.是的,这很糟糕,是的,这不是我们有两种选择的原因.
Zed*_*Zed 10
ETS优于流程字典的好处是:
rvi*_*ing 10
ETS或多或少的行为就好像表是在一个单独的进程中,请求是发送到该进程的消息.虽然没有用流程实现,但ETS的属性就是这样建模的.事实上,可以用流程实现ETS.
这意味着副作用属性与Erlang的其余部分一致.
进程字典就像Erlang中的其他内容一样,添加它是一个很大的错误.没有理由使用进程字典而不是像dict或gb_trees这样的进程本地字典之一.
毫无疑问,ETS 具有更多的功能和更复杂的功能。但...
由于流程字典更新/查找操作仅移动引用,而不是整个数据(请参阅 Christian 的准确答案),因此它可以更快,尤其是对于大数据结构。有一次,我重构了一部分代码以将大的和经常访问的数据结构保留在 proc 中。dict 而不是 ETS,我们在这部分代码中获得了 30% 的加速。
在许多情况下,数据只能由单个进程访问。在那种情况下,我看不出 proc.dict 和 ETS 之间有很大的理论差异。两者都用于将副作用保留在内存中。此外,您可以访问另一个进程的proc.dict,例如
process_info(whereis(net_kernel),dictionary)。