《Programming Erlang》第8章后面有一個練習,Ring Benchmark。就是說創建N個進程,把它們組合成環狀。然后在這個環上把一條消息在環上傳遞M圈,然后記錄所有的時間。實現起來也挺簡單,20行左右吧:
1 -module(ring_benchmark).
2 -export([start/2]).
3
4 start(N, M) ->
5 Pid = create_process(self(), N - 1, M),
6 time(fun() -> Pid ! start, loop(Pid, M) end).
7
8 time(Fun) ->
9 statistics(wall_clock),
10 Fun(),
11 {_,Time} = statistics(wall_clock),
12 io:format("Run : ~w s ~n", [Time/1000]).
13
14 create_process(Pid, 0, _) -> Pid;
15 create_process(Pid, N, M) -> create_process(spawn(fun() -> loop(Pid, M) end), N - 1, M).
16
17 loop(_, 0) -> void;
18 loop(Next, M) ->
19 receive
20 Message -> Next ! Message,
21 loop(Next, M - 1)
22 end.
23
24
有意思是它還有一個第二問,讓你用另外一種熟悉的語言實現同樣的功能,發送同樣多的消息,也把時間記錄下來,然后寫一篇blog來publish你的結果。其實,大家心知肚明,這種lightweight process啊,message passing concurrency啊都是Erlang的強項,而且實測結果也著實頗為恐怖,一般也就沒那閑心拿別的東西來陪襯一把了(Armstrong同學自己實現了一個Java version,效率大約能差到百倍吧)。不過還真有那寫不信邪的老大,
用stackless python實現了同樣的ring benchmark,發現比erlang還快...后來修改代碼去掉io操作,Erlang倒是比stackless python快些,但也只是一些而已。