在Erlang中,在进程中使用ets而不是进程字典有什么好处?

时间:2009-09-27 13:07:50

标签: erlang

我认为使用ets仍然会引入类似的副作用。

4 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:9)

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

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

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

答案 3 :(得分:3)

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

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

  • 在许多情况下,数据只能由一个进程访问。在那种情况下,我看不到proc.dict和ETS之间的重大理论差异。两者都用于保持记忆中的副作用。 此外,您可以访问另一个进程的proc.dict,如

      

    process_info(whereis(net_kernel),词典)。