大型二进制文件的 Erlang 消息传递,优化性能建议

Erlang Message Passing for Large Binaries, Optimizing Performance Recommendations

好的,这是我今天一直在思考的问题(如果我没有事先得到答案,我将在下周进行测试)。

我有许多 Erlang 进程需要在它们之间传递大型二进制文件。我一直在做的是使用 gproc:send 定位二进制文​​件并将其发送到适当的进程。但是,我不只发送二进制文件,我通常发送一个元组,例如“{self(),atom, Msg\binary}”。一开始以为这样就可以满足大型二进制消息处理的要求,避免内存拷贝操作。

8.2 处理消息

All data in messages between Erlang processes is copied, with the exception >of refc binaries on the same Erlang node.

发件人:Erlang Efficiency Guide

但是现在,我开始怀疑,消息 processor/compiler/etc 是否会理解那里有一个 >64k 的二进制文件?或者它会看到元组然后想,让我们将整个事情复制到另一个进程?就像我指出的那样,我确实计划在下周进行测试以查看结果,我很乐意用我的发现更新 post。

我正在使用 R16B03-1。

谢谢!

大小大于或等于64字节的二进制文件存储在共享区域并被引用计数,因此它们不会在进程之间复制;仅复制对它们的引用。

元组实际上并不包含它们的元素,而是包含指向它们的指针。所以当元组被复制时,元组中的每个值也会被复制。大(> 64)和小二进制文件在下面有不同的类型,即使对于用户来说它们看起来很相似。因此 VM 可以使用不同的复制操作。