%%%------------------------------------------------------------------- %%% File : huffman.erl %%% Author : Per Gustafsson %%% Description : %%% %%% Created : 6 Mar 2006 by Per Gustafsson %%%------------------------------------------------------------------- -module(huffman). -export([test/1,main/2]). %%-------- Code for the benchmark ------------------------------- decode(<<"huff",TS:16,T:TS/binary,NBs:32,Bs:NBs/binary-unit:1,_/binary>>) -> %1 Tree = construct_tree(T), %2 list_to_binary(decode(Bs,Tree,Tree,[])). %3 decode(<<0:1,Rest/binary>>,{Left,_}, Tree, Acc) -> %4 decode(Rest,Left,Tree,Acc); %5 decode(<<1:1,Rest/binary>>,{_,Right}, Tree, Acc) -> %6 decode(Rest,Right,Tree,Acc); %7 decode(<<>>, X, _Tree, Acc) when is_integer(X) -> %8 lists:reverse([X|Acc]); %9 decode(<>, X, Tree, Acc) when is_integer(X) -> %10 decode(Rest,Tree,Tree,[X|Acc]). %11 construct_tree(<>) -> X; %12 construct_tree(<>) -> %13 {construct_tree(Left),construct_tree(Right)}. %14 %%---------- Stuff for benchmarking --------------------------------- -define(ITER,10). test([InName]) -> {ok,Bin} = file:read_file(InName), erlang:spawn_opt(?MODULE,main,[Bin,InName],[{min_heap_size, 8000000}]). main(Bin,InName) -> statistics(runtime), Res = iter(?ITER,fun() -> decode(Bin) end), {_,X} = statistics(runtime), io:format("~.3f",[X/1000]), file:write_file(InName++".erlang",Res), halt(). iter(1,F) -> F(); iter(N,F) -> F(),iter(N-1,F).