我认为使用ets仍然会引入类似的副作用。
答案 0 :(得分:12)
ETS不是垃圾收集的,因为它存储在erlang进程之外的堆中。这意味着当你把东西放入ets时会被复制到它中,当你拿出它时,你会在你的过程中得到一份副本。进行大量的ets查找可能会导致过程中出现过多的问题(但这只适用于非常高的吞吐量)。
进程字典是垃圾回收的。它存储在进程自己的堆中。因此,当您查看其中的内容时,您将获得与您放入的完全相同的值的引用。存储在流程字典中的值不会被压缩。
两种方法都是非纯的,即它们具有副作用。是的,它很糟糕,是的,这不是我们有两种选择的原因。
答案 1 :(得分:10)
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),词典)。