论坛首页 综合技术论坛

进程字典到底有多快

浏览 3302 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-07-29   最后修改:2009-07-29
一直以来 erlang的几本书的作者都建议不要用process dict,倒不是它的性能不好,而是因为process dict破坏了fp的变量不可变语义,所以引起了不好的印象。其实在很多场合,是很合用的。process dict 有几个好处:
1. 无锁,所以高速。
2. hash实现。
3. 内容参与gc。
4. 实现的很细致。
5. 变量可变。

以下是试验:
root@nd-desktop:~# cat dicttest.erl
-module(dicttest).
-export([test_put/1, test_get/1]).

test_put(N)->
    Start = erlang:now(),
    dotimes(N, fun (I) -> put(I, hello) end),
    Stop = erlang:now(),
    N / time_diff(Start, Stop).

test_get(N)->
    Start = erlang:now(),
    dotimes(N, fun (I) -> get(I) end),
    Stop = erlang:now(),
    N / time_diff(Start, Stop).

dotimes(0, _) -> done;
dotimes(N, F) ->
    F(N),
    dotimes(N - 1, F).

time_diff({A1,A2,A3}, {B1,B2,B3}) ->
    (B1 - A1) * 1000000 + (B2 - A2) + (B3 - A3) / 1000000.0 .


root@nd-desktop:~# erl -smp disable +h 9999999
Erlang R13B01 (erts-5.7.2) [source] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.2  (abort with ^G)
1> dicttest:test_put(1000000).
9174480.26569295
2> dicttest:test_get(1000000).
34172105.390379503
3> length(element(2, process_info(self(), dictionary))).
1000000

测试的速度相当的快了。 百万条级别,插入100ns, 查询40ns. 而ets的速度大概是us,差了一个数量级别。

结论:合适的场合 猛用。


   发表时间:2009-08-05  
哈哈,够猛。怪不得mochiweb把解析的数据放到process dict,称其为cache。
果真猛!
0 请登录后投票
   发表时间:2009-08-05  
几个高性能的开源软件如mochiweb rabbitmq都大量用了dict,除了性能上的优势, 代码也简单。
0 请登录后投票
   发表时间:2010-04-14  
process dict除开 put get erase还有其它的函数没?
0 请登录后投票
   发表时间:2010-04-14  
hittyo 写道
process dict除开 put get erase还有其它的函数没?

字典最基本的操作, 其他的也不需要把...
0 请登录后投票
   发表时间:2010-04-15  
看了一下老大之前的文章似乎对于变量不可变语义思想有些不宵

试问变量不可变的思想该怎么理解透彻?
0 请登录后投票
   发表时间:2010-04-15  
变量不可变挺好呀! 除了在性能苛刻的地方 你需要类似ets或者其他的手段交换全局信息
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics