Chr*_*ian 13

ETS不是垃圾收集的,因为它存储在erlang进程之外的堆中.这意味着当你把东西放入ets时会被复制到它中,当你把它拿出来时,你会在你的过程中得到一份副本.然后进行大量的ets查找会导致过程中出现过多的问题(但这只适用于非常高的吞吐量).

进程字典是垃圾收集的.它存储在进程自己的堆中.因此,当您查看其中的内容时,您将获得与您放入的完全相同的值的引用.存储在流程字典中的值不会被压缩.

两种方法都是非纯的,即它们具有副作用.是的,这很糟糕,是的,这不是我们有两种选择的原因.

  • "几乎所有的Erlang书籍"......这是否意味着三分之二?=) (14认同)

Zed*_*Zed 10

ETS优于流程字典的好处是:

  • 其他进程可以直接访问ETS表
  • ETS为您提供搜索/匹配/迭代功能,而进程字典只是一个键值存储.
  • 您可以一步保存/加载表到文件
  • 如果您的所有者进程终止,则表可以由其他人继承,因此数据不会丢失.


rvi*_*ing 10

ETS或多或少的行为就好像表是在一个单独的进程中,请求是发送到该进程的消息.虽然没有用流程实现,但ETS的属性就是这样建模的.事实上,可以用流程实现ETS.

这意味着副作用属性与Erlang的其余部分一致.

进程字典就像Erlang中的其他内容一样,添加它是一个很大的错误.没有理由使用进程字典而不是像dict或gb_trees这样的进程本地字典之一.

  • 我猜ETS和"基于进程的ETS"之间的区别在于前者可以在使用精细锁时真正同时访问,而后者将始终强制执行同步(也就是序列化). (2认同)

tzp*_*tzp 6

毫无疑问,ETS 具有更多的功能和更复杂的功能。但...

  • 由于流程字典更新/查找操作仅移动引用,而不是整个数据(请参阅 Christian 的准确答案),因此它可以更快,尤其是对于大数据结构。有一次,我重构了一部分代码以将大的和经常访问的数据结构保留在 proc 中。dict 而不是 ETS,我们在这部分代码中获得了 30% 的加速。

  • 在许多情况下,数据只能由单个进程访问。在那种情况下,我看不出 proc.dict 和 ETS 之间有很大的理论差异。两者都用于将副作用保留在内存中。此外,您可以访问另一个进程的proc.dict,例如

    process_info(whereis(net_kernel),dictionary)。