[erlang-questions] Benchmarking Erlang: Deathmatch of gb_trees, dict, ets, mnesia ... and registered names

Joel Reymont <>
Thu Oct 9 13:08:54 CEST 2008


%%% gb_trees

-module(map1).
-behaviour(gen_server).

-export([init/1, handle_call/3, handle_cast/2,
	 handle_info/2, terminate/2, code_change/3]).

-export([start/0, test/1, populate/2, lookup/2]).

-record(data, {
           xref
	 }).

start() ->
     gen_server:start(map1, [], []).

init([]) ->
     {ok, #data{ xref = gb_trees:empty() }}.

terminate(_, _) ->
     ok.

handle_cast({'ADD', Key, Val}, Data) ->
     Xref = Data#data.xref,
     {noreply, Data#data{ xref = gb_trees:enter(Key, Val, Xref) }};

handle_cast(stop, Data) ->
     {stop, normal, Data}.

handle_call({'LOOKUP', Key}, _From, Data) ->
     {reply, gb_trees:get(Key, Data#data.xref), Data}.

handle_info(Info, Data) ->
     error_logger:info_report([{module, ?MODULE},
			      {line, ?LINE},
			      {self, self()},
			      {message, Info}]),
     {noreply, Data}.

code_change(_, Data, _) ->
     {ok, Data}.

test(N) ->
     {ok, Pid} = start(),
     {T1, _} = timer:tc(map1, populate, [Pid, N]),
     {T2, _} = timer:tc(map1, lookup, [Pid, N]),
     io:format("Populate: ~.4. f~n", [T1 / 1000000]),
     io:format("Lookup:   ~.4. f~n", [T2 / 1000000]),
     gen_server:cast(Pid, stop).

populate(_, 0) ->
     ok;

populate(Pid, N) ->
     gen_server:cast(Pid, {'ADD', N, N}),
     populate(Pid, N - 1).

lookup(_, 0) ->
     ok;

lookup(Pid, N) ->
     gen_server:call(Pid, {'LOOKUP', N}),
     lookup(Pid, N - 1).





More information about the erlang-questions mailing list