함수 실행 시간 측정

1532 단어 erlangF#
어떤 함수의 실행 시간을 측정하여 최적화해야 할 때가 많다.
erlang에서timer:tc/3를 통해 어떤 함수의 실행 시간을 쉽게 얻을 수 있습니다.

tc(Module, Function, Arguments) -> {Time, Value}

Types Module = Function = atom()
Arguments = [term()]
Time = integer() in microseconds
Value = term()

반환값에서 Time은 함수 소모 시간을 나타내며 단위는 ms입니다.
때때로 우리는 어떤 함수의 집행을 여러 번 해야 함수의 집행 시간을 더욱 정확하게 얻을 수 있다. 우리는 이런 함수를 쓸 수 있다.

-module(test_avg).
-compile(export_all).

tc(M, F, A, N) when N > 0 ->
    L = test_loop(M, F, A, N, []),
    Len = length(L),
    LSorted = lists:sort(L),
    Min = lists:nth(1, LSorted),
    Max = lists:nth(Len, LSorted),
    Med = lists:nth(round(Len/2), LSorted),
    Avg = round(lists:foldl(fun(X, Sum) ->
				    X + Sum end,
			    0,
			    LSorted)/Len),
    io:format("Range:~b - ~b mics~n"
	      "Median:~b mics ~n"
	      "Average:~b mics ~n",
	      [Min, Max, Med, Avg]),
    Med.

test_loop(_M, _F, _A, 0, List) ->
    List;
test_loop(M, F, A, N, List) ->
    {T, _R} = timer:tc(M, F, A),
    test_loop(M, F, A, N-1, [T|List]).

이렇게 하면 우리는 어떤 함수가 여러 번 실행하는 최소 소모 시간, 최대 소모 시간, 평균 소모 시간을 얻을 수 있다.
실험해 보자:
> 
test_avg:tc(test_state, test, [], 10).
>Range:68 - 99 mics
Median:76 mics
Average:77 mics

좋은 웹페이지 즐겨찾기