《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快些,但也只是一些而已。