在erlang进程之间发送消息:Atoms vs Binaries

时间:2015-09-02 09:14:08

标签: erlang elixir mnesia erlang-shell

当我将原子作为信息发送时,原子是否从一个进程复制到另一个进程?我的想法是,因为这个原子已经存在于VM中,所以不必复制。我知道当从一个进程发送到另一个进程时,二进制文件会更有效。

如果我发送一个触发消息,从一个进程到另一个进程的常量消息,最好使用:atom或binary?

1 个答案:

答案 0 :(得分:9)

在语义上使用最正确的。一般情况下,除非您已经过基准测试,并且确信您的代码可以从优化中受益,否则不要担心性能。如果你在语义上使用最正确的东西,那么无论如何它都可能是最快的。

那说,语义上最正确的是什么?

Atom可用于标记或识别不会发生变化的静态术语。因此,如果您想告诉流程做一些工作,您可以写:send(pid, :do_some_work)。然后另一个过程可以很容易地匹配原子并执行所需的工作(与原子的比较非常快)。

但是,如果您要传递动态内容,那么您肯定要使用二进制文件。将二进制转换为原子实际上是不安全的,原子也有大小限制。你不能拥有一个1千字节长的原子。

最后,值得指出的是原子是最快复制的。原子表示为整数,它们取1个字。所以你只复制了一个字。

二进制文件,即使它们在一定大小后共享,也至少需要3个单词。

更多信息:Why is useful to have a atom type (like in elixir, erlang)?

Erlang VM效率指南:http://www.erlang.org/doc/efficiency_guide/advanced.html