Erlang에서 함수 실행 시간 측정하기

전형적으로 함수 실행 전후에 시간을 측정한 다음 그 시간차를 계산해서 실행 시간을 측정한다. erlang에서는 다음과 같이 구현할 수 있다.

T1 = erlang:timestamp(),
% (add your function(s) here)
T2 = erlang:timestamp(),
timer:now_diff(T2, T1).

전에는 now()를 썼었는데 deprecated 되었고 요즘은 erlang:timestamp()를 사용한다.

하지만 erlang에서는 위와 같이 함수의 실행 시간을 측정할 수 있는 timer:tc 함수를 사용해서 보다 간단하게 표현할 수 있다. 인수 갯수는 함수가 인수가 있는 지 없는지, 그리고 외부 모듈이냐 아니냐에 따라 /1에서 /3까지 세 가지 종류가 있다. 모두 반환값은 동일하며, Time은 밀리초 단위이다.

timer:tc(Fun) -> {Time, Value}
timer:tc(Fun, Args) -> {Time, Value}
timer:tc(Mod, Fun, Args) -> {Timer, Value}

예로 삼아 다음과 같이 실행할 수 있다.

1> timer:tc(io, format, ["~p + ~p = ~p~n", [1, 2, 1+2]]).
1 + 2 = 3
{67,ok}

1 + 2 = 3io:format/2 함수 실행의 실행으로 인해 출력된 것이다. {67, ok}io:format/2를 실행하는데 67ms가 걸렸으며 그 반환값은 ok라는 의미이다. ["~p + ~p = ~p~n", [1, 2, 1+2]]io:format/2에 넘겨지는 파라미터로, timer:tc/2 내부적으로는 apply함수에 의해 io:format("~p + ~p = ~p~n", [1, 2, 1+2])과 동일하게 실행된다.