R17中maps模块和dict模块该如何使用

169 views
Skip to first unread message

zehongzheng2008

unread,
Feb 7, 2014, 4:12:47 AM2/7/14
to erlang-china
两个模块都是map类型,
使用中 怎么选用?

Lihe Wang

unread,
Feb 7, 2014, 9:31:53 AM2/7/14
to erlang...@googlegroups.com
我还没有挖源码,所以简单说一下基本的理解。dict的数据空间属于erlang运行时系统,而新的maps好像是一种新的数据类型,所以数据空间应该属于进程,就是说新的maps应该和整数什么的处于同一量级。所以,整体上,访问速度,应该是maps更快,maps速度应该和进程字典相当。maps如果是一种类型,那么应该可以用消息发出去。那么内部的实现应该和binary相似。所以共享性上,dict应该更好,所有进程可以同时访问,但是maps应该不行,只能进程内或收到消息的进程才行,如果用不好,估计会发生大量数据复制的问题。再有就是maps设计了新的语法,那么编译器可以做一些优化。我暂时还没测试,但是估计tuple使用过程中,只能使用atom访问而造成的一些麻烦可以避免,也就是说,为了更好的速度,在源码中硬编码成tuple的基础数据,以前需要自己写代码在开始运行时灌入数据,或是不能使用变量访问的问题,现在编译器可以做了,并且性能也不错,当然hash查找仍然比不上直接偏移的性能。但是某些性能不太重要的地方,代码量会有减少。


在 2014年2月7日 下午5:12,zehongzheng2008 <zehongz...@vip.qq.com>写道:
两个模块都是map类型,
使用中 怎么选用?

--
您收到此邮件是因为您订阅了 Google 网上论坛的“Erlang China”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 erlang-china...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。

Lihe Wang

unread,
Feb 7, 2014, 9:57:08 AM2/7/14
to erlang...@googlegroups.com
对不起,我好像乌龙了,刚才脑子抽了,说的是ets表和maps的区别。

jiemar

unread,
Feb 7, 2014, 11:01:15 AM2/7/14
to erlang...@googlegroups.com
也就是说maps效率比dict高.
那maps 可以拿来取代 dict 和 record了是吧

在 2014年2月7日星期五UTC+8下午10时31分53秒,Wang Lihe写道:

Lihe Wang

unread,
Feb 7, 2014, 6:58:06 PM2/7/14
to erlang...@googlegroups.com
具体性能还不大好说,因为两个都是进程内部的数据,需要测一下,我暂时没环境搞两套,因为r17没发布,关注一下而已,哈哈。取不取代的话吧,还是要看应用。这么说吧,先对比一下两个的数据层级:dict:erts->tuple->BIFS->record->dict;maps:erts->maps->BIFS。也主是说,maps是一个和tuple一个层次的类型,erlang运行时内部并没record类型,那个是编译器使用tuple模拟出来的。所以呢,因为maps是一个新的类型,所以写代码的时候也许可以使用一些技巧少写些代码;而说到性能呢,maps会使用更多的BIFS,于是会在erts和虚拟机之间做更多的切换,而dict可能会少一些,erts和虚拟机的关系我的理解类似于操作系统和进程之间的关系,进程使用自己内部的数据更快,不需要调度切换,而使用系统调用(相比于BIF),会切换一下,大量的切可能会有性能问题。但话说,我大量的使用NIF,还没观察到性能下降,BIF应该更猛一点。概念归概念,具体性能还是要测。
而至于说取代dict和record,因为不在同一个层次,我认为看心情吧,爱用哪个用哪个。maps取代tuple我认为是不行,tuple实际上是连续内存空间,而maps是比lists还要复杂的非连续内存空间,随机定位的性能极限理论上也达不到tuple的一半。概念上,list是一切,tuple和maps都可以用list加函数模拟,但工程上,各取所需吧。(连夜看了一点maps的代码,发现CAR,CONS什么的,lisp与C的混合体,“wan开”!)

niu仔

unread,
Feb 7, 2014, 9:14:41 PM2/7/14
to erlang...@googlegroups.com

对dict 和 maps两个模块同样的操作对比, maps 可以洗洗睡了,毫无吸引力.



在 2014年2月8日星期六UTC+8上午7时58分06秒,Wang Lihe写道:
Reply all
Reply to author
Forward
0 new messages