在最新版本的Elixir中,Access不再作为协议实现,而是作为一种行为实现.从我收集的内容来看,这种变化是出于开发模式中的性能考虑.
现在,看一下实现,我想知道这是如何在内部工作的,以及为什么选择这个实现.正如我们在这里看到的,Access通过底层映射的"__struct__"键调度到struct的模块.AFAICS,这大致类似于OOP风格的多态.关于这个的一些问题:
正如您已经提到的那样,Access的实现已更改为使用“行为”而不是“协议”。原因是性能。
虽然协议调度;根据数据类型时做了很多繁重的你的,他们仍然会永远不够快的Access,因为他们实现(合并)的方式,
因此,尽管在需要将某些功能绑定到数据结构而不是模块时应始终使用协议,但这Access是一种特殊情况。
由于
Access协议依赖于开发和测试模式下的代码服务器(未应用协议合并时),因此,由于代码服务器已成为具有多个进程的瓶颈,因此我们听到了许多有关系统性能严重下降的报告。发生这种情况是因为该
Access协议最终被调用了数千次,并且我们无法做很多改进(与内联大多数列表情况的Enumerable协议相反)。
进一步阅读: