【发布时间】:2015-11-27 17:22:41
【问题描述】:
当我将原子作为消息发送时,原子是否从一个进程复制到另一个进程?我的想法是,由于这个原子已经存在于 VM 中,因此不必复制。我知道二进制文件在从一个进程发送到另一个进程时效率更高。
如果我要发送触发消息,即从一个进程到另一个进程的恒定消息,哪个更好用:原子还是二进制?
【问题讨论】:
-
过早优化 == 万恶之源。
标签: erlang elixir mnesia erlang-shell
当我将原子作为消息发送时,原子是否从一个进程复制到另一个进程?我的想法是,由于这个原子已经存在于 VM 中,因此不必复制。我知道二进制文件在从一个进程发送到另一个进程时效率更高。
如果我要发送触发消息,即从一个进程到另一个进程的恒定消息,哪个更好用:原子还是二进制?
【问题讨论】:
标签: erlang elixir mnesia erlang-shell
使用语义上最正确的内容。一般来说,除非您进行了基准测试并且您确定您的代码可以从优化中受益,否则不要担心性能。如果你使用语义上最正确的东西,无论如何它可能是最快的。
也就是说,什么是最正确的语义?
原子对于标记或识别静态的、不会改变的术语很有用。所以如果你想告诉一个进程做一些工作,你可以写:send(pid, :do_some_work)。然后其他进程可以轻松地在原子上匹配并执行所需的工作(与原子的比较非常快)。
但是,如果您要传递动态内容,那么您肯定希望使用二进制文件。将二进制文件转换为原子实际上是不安全的,而且原子也有大小限制。你不能有一个 1 KB 长的原子。
最后,值得指出的是,原子是迄今为止复制速度最快的。原子表示为整数,它们占用 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
【讨论】: