-module(timer1). -export([tc/4, tc/5]). tc(N, M, F, A) when N > 0 -> tc(N, M, F, A, false). tc(N, M, F, A, Do_acc) when N > 0, is_boolean(Do_acc) -> Pid = spawn_opt(fun() -> if Do_acc -> exit(call_acc(N, M, F, A, erlang:now(), [])); true -> exit(call(N, M, F, A, erlang:now())) end end, [{min_heap_size, 10000}]), MRef = erlang:monitor(process, Pid), receive {'DOWN', MRef, process, _, Result} -> Result end. call(1, M, F, A, Start) -> Res = (catch apply(M, F, A)), Stop = erlang:now(), {timer:now_diff(Stop, Start), Res}; call(N, M, F, A, St) when N > 0 -> catch apply(M, F, A), call(N-1, M, F, A, St). call_acc(N, M, F, A, St, Acc) when N > 0 -> call_acc(N-1, M, F, A, St, [catch apply(M, F, A)|Acc]); call_acc(0, _, _, _, Start, Acc) -> Stop = erlang:now(), {timer:now_diff(Stop, Start), lists:reverse(Acc)}.