Erlang本、やっとp.125まできた

練習問題、30分だけ、やってみよう。
とかいって、嘘。ぜんぜんできなかった。statisticsの挙動が把握できてないし。(追記:Young risk taker.: [Erlang] 実行時間計測を読もう→俺)

とりあえず(2)のほうのコードのメモ。

 -module(bead).
 -compile(export_all).

start(N,M) -> 
	P = spawn(fun() -> setup(self()) end),
	P ! {self(), setup, N},
	statistics(runtime),
	statistics(wall_clock),
	io:format("kick off~n",[]),
	P ! {self(), kick, M, M}.

setup(PPid) ->
	receive
		{Pid, setup, 0} ->
			io:format("Received:~p~n",[Pid]),
			PPid ! {ok},
			loop(PPid);
		{_Pid, setup, A} ->
			Nxtp = spawn(fun() -> setup(PPid) end),
			Nxtp ! {PPid, setup, A - 1},
			loop(Nxtp);
		Any ->
			io:format("ignored:~p~n",[Any]),
			setup(PPid)
	end.


loop(Nxtp) ->
	receive
		{_Pid, kick, 0, Total} ->
			{_, Time1} = statistics(runtime),
			{_, Time2} = statistics(wall_clock),
			U1 = Time1 * 1000 / Total,
			U2 = Time2 * 1000 / Total,
			io:format("mean passing time ~p usec (~p) usec)~n",[U1,U2]);
		{_Pid, kick, M, Total} ->
			Nxtp ! {self(), kick, M - 1, Total},
			loop(Nxtp)
	end.

実行してみると、こんな風景。

1> c(bead).
{ok,bead}
2> bead:start(1000,10000).
kikk off
{<0.31.0>,kick,10000,10000}
Received:<0.38.0>
mean passing time 1.00000 usec (1.90000) usec)
3> bead:start(1000,1000000).
kick off
{<0.31.0>,kick,1000000,1000000}
Received:<0.1040.0>
mean passing time 7.00000e-2 usec (0.540000) usec)

でも、これって、誰のプロセスのcputimeを測ってるんだろうか?
この場合、頼りになるのはwall_clockのelapsed timeだけか?