【问题标题】:Erlang list-argument memory usage (efficiency & performance)Erlang 列表参数内存使用情况(效率和性能)
【发布时间】:2021-12-08 18:01:33
【问题描述】:

我的印象是,在 Erlang 中调用函数时,Erlang 会将整个参数从调用者深度复制到被调用者,主要由Erlang Efficiency Guide 告知。但是,我确实注意到该指南以及 original paper 主要关注记录而不是列表。我试图找到一个规范或其他东西来解释 Erlang 如何传递列表参数,但这些努力都是徒劳的。

此时,我的一位同事来找我,告诉我 Erlang 像 C 指针和 Golang 切片一样“通过引用”传递列表参数,但根据我的经验,这似乎不是真的。由于手头没有可靠的知识,我无法证明我或他的假设。

我想知道是否有这样的文档、论文或规范可以让我了解 Erlang 如何处理列表参数?毫无疑问,越官方越好,但实际上即使是博客或电子邮件也可以。

【问题讨论】:

  • 我认为这不是一般规则。 Erlang 是一种支持 immutability 的语言,在将参数传递给函数时复制参数是没有意义的。但是,我们在效率指南中看到的是涉及生成新进程的示例,并且由于进程之间也没有共享,因此副本是必不可少的,这也应该适用于列表......我的猜测。

标签: performance erlang


【解决方案1】:

调用函数时,所有数据结构都通过引用传递(例外是“立即数”,例如小整数和原子,它们直接按值传递)。对于普通的函数调用,您永远不必担心开销。

然而,当生成一个进程时,它的初始函数调用的任何参数都需要复制到新进程的堆中,就像它们是在进程启动时发送给进程的消息一样。这样,新进程是在同一台机器上运行还是在网络上的不同机器上运行都没有关系。

请参阅The Beam Book,深入了解 Beam 虚拟机的工作原理。

【讨论】:

  • 谢谢!这确实是我需要的:)
猜你喜欢
  • 2012-09-20
  • 1970-01-01
  • 2012-08-17
  • 2014-09-04
  • 2011-10-02
  • 2011-07-30
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多