Pattern matching vs. ETS lookups

Vance Shipley vances@REDACTED
Tue Feb 17 07:13:38 CET 2004


Forgot to attach the attachments ...

On Tue, Feb 17, 2004 at 01:01:14AM -0500, Vance Shipley wrote:
}  
}  The attached runs four different versions a gen_server.
-------------- next part --------------
-module(tets).
-export([init/1, handle_call/3, terminate/2]).
-behaviour(gen_server).
 
init(Used) ->
	State = ets:new(mf, [private]),
	ets:insert(State, ttables:make_list(Used)),
   {ok, State}.

handle_call(<<FunctionID:16, Body/binary>>, _From, State) ->
	case catch ets:lookup_element(State, FunctionID, 2) of
		{'EXIT', _Reason} ->
			{reply, undefined, State};
		{M, F} ->
   		{reply, {M, F}, State}
	end.

terminate(Reason, State) -> ok.
 
-------------- next part --------------
-module(ttime).
-export([tlist/2, tlist/1, ttree/2, ttree/1, ttuples/1, tets/2, tets/1]).

tlist(N) -> tlist(N, 16#ffff).
tlist(N, Used) -> go(N, Used, tlist).

ttree(N) -> ttree(N, 16#ffff).
ttree(N, Used) -> go(N, Used, ttree).

ttuples(N) -> go(N, 16#ffff, ttuples).

tets(N) -> tets(N, 16#ffff).
tets(N, Used) -> go(N, Used, tets).


go(N, Used, Module) ->
	{ok, Pid} = gen_server:start_link(Module, Used, []),
	TraceFile = atom_to_list(Module) ++ ".trace",
	ok = fprof:trace(start, TraceFile),
	do(Pid, N, []),
	fprof:trace(stop).

do(Pid, 0, Acc) -> 
	Acc;
do(Pid, N, Acc) ->
	Bin = <<(random:uniform(16#ffff)):16, <<0:256>>/binary>>,
	MF = gen_server:call(Pid, Bin),
	do(Pid, N - 1, Acc ++ [MF]).

-------------- next part --------------
-module(ttree).
-export([init/1, handle_call/3, terminate/2]).
-behaviour(gen_server).
 
init(Used) ->
   {ok, ttables:make_tree(Used)}.

handle_call(<<FunctionID:16, Body/binary>>, _From, State) ->
	case gb_trees:lookup(FunctionID, State) of
		{value, {M, F}} ->
   		{reply, {M, F}, State};
		none ->
			{reply, undefined, State}
	end.

terminate(Reason, State) -> ok.
 
-------------- next part --------------
-module(ttables).
-export([make_list/0, make_list/1, make_tree/0, make_tree/1,
			make_tuple_of_tuples/0]).


make_list() ->
	make_list(16#ffff).
make_list(Used) ->
	make_list(Used, 16#ffff, []).
make_list(Used, -1, Acc) ->
	Acc;
make_list(Used, X, Acc) ->
	case skip(Used) of
		false ->
			make_list(Used, X - 1, [{X, make_tuple()}] ++ Acc);
		true ->
			make_list(Used, X - 1, Acc)
	end.

make_tree() ->
	make_tree(16#ffff).
make_tree(Used) ->
	gb_trees:from_orddict(make_list(Used)).

make_tuple_of_tuples() ->
	make_tuple_of_tuples(16#ff, []).
make_tuple_of_tuples(-1, Acc) ->
	list_to_tuple(Acc);
make_tuple_of_tuples(X, Acc) ->
	T = make_tuples(16#ff, []),
	make_tuple_of_tuples(X -1, [T] ++ Acc).

make_tuples(-1, Acc) ->
	list_to_tuple(Acc);
make_tuples(X, Acc) ->
	make_tuples(X -1, [make_tuple()] ++ Acc).

make_tuple() ->
	{make_atom(), make_atom()}.
	
make_atom() ->
	Length = random:uniform(20) + 5,
	make_atom(Length, []).
make_atom(0, Acc) ->
	list_to_atom(Acc);
make_atom(X, Acc) ->
	C = random:uniform(26) + 96,
	make_atom(X - 1, Acc ++ [C]).

skip(Used) ->
	case random:uniform(round(16#ffff/Used)) of
		1 -> false;
		_ -> true
	end.
-------------- next part --------------
-module(tlist).
-export([init/1, handle_call/3, terminate/2]).
-behaviour(gen_server).
 
init(Used) ->
   {ok, ttables:make_list(Used)}.

handle_call(<<FunctionID:16, Body/binary>>, _From, State) ->
	case lists:keysearch(FunctionID, 1, State) of
		{value, {M, F}} ->
   		{reply, {M, F}, State};
		false ->
			{reply, undefine, State}
	end.

terminate(Reason, State) -> ok.
 
-------------- next part --------------
-module(ttuples).
-export([init/1, handle_call/3, terminate/2]).
-behaviour(gen_server).
 
init(_) ->
   {ok, ttables:make_tuple_of_tuples()}.

handle_call(<<FunID_MSB:8, FunID_LSB:8, Body/binary>>, _From, State) ->
	{M, F} = element(FunID_LSB + 1, element(FunID_MSB + 1, State)),
   {reply, {M, F}, State};

handle_call({stop, Reason}, _From, State) ->
   {stop, Reason, State}.

terminate(Reason, State) -> ok.
 


More information about the erlang-questions mailing list