在Erlang进程中使用映射而不是记录来保存状态是否有任何优势?

tor*_*tte 5 erlang

我见过的大多数书籍或在线资源都使用记录来保持一个过程的状态(可能因为这是多于(?)十年的方式).另一方面,map有效地用于替换stdlib中的元组(例如,supervisor模块中的childspecs).

作为一个例子,我正在通过Learn You Some Erlang的有限状态机章节工作,state记录可以替换为在init/1需要的回调中声明的映射gen_fsm.

  • 我不需要记录声明,而且到目前为止我所阅读的大部分内容都是最佳实践,因为.hrl文件使得跟踪错误变得更加困难.
  • 参考函数子句中的进程状态也会更短但是它们都清楚地传达了状态变量的结构,并且几个额外的字符不是问题.

此外,它会更有效吗?
我知道一个经过深思熟虑的基准测试可以回答我的问题,但我只用了几个星期就学习了Erlang,而地图 模块相当新,而且还在变化.

更新:感谢我给出了可怕的建议,我更彻底地阅读了地图上LYSE章节,答案很明确:

使用记录的优点是密钥在编译时是已知的,这带来了优势

  • 快速访问特定值(比动态更快)
  • 额外的安全(早期崩溃而不是腐败状态)
  • 更容易检查类型

这些记录绝对适合进程的内部状态,尽管偶尔会编写更冗长的code_change函数.

另一方面,Erlang用户将使用记录来表示复杂的嵌套键/值数据结构(奇怪地类似于面向对象语言中的对象),这些数据结构经常跨越模块边界,因此地图将有很大帮助.记录是该工作的错误工具.

I G*_*ICE 5

我已经在“ 学习一些Erlang”网站上添加了有关地图的专门章节:http : //learnyousomeerlang.com/maps

墨西哥隔离节专门比较映射到记录和类型的字典。从语义上讲,映射比字典更类似于字典,我的建议是在有意义的记录上使用记录(具有O(1)访问权限的已知类型的受限键集),以及要使用字典的地图(键/值对的异构异构集合)。