《Programming Erlang》第8章后面有一個(gè)練習(xí),Ring Benchmark。就是說(shuō)創(chuàng)建N個(gè)進(jìn)程,把它們組合成環(huán)狀。然后在這個(gè)環(huán)上把一條消息在環(huán)上傳遞M圈,然后記錄所有的時(shí)間。實(shí)現(xiàn)起來(lái)也挺簡(jiǎn)單,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 

有意思是它還有一個(gè)第二問(wèn),讓你用另外一種熟悉的語(yǔ)言實(shí)現(xiàn)同樣的功能,發(fā)送同樣多的消息,也把時(shí)間記錄下來(lái),然后寫一篇blog來(lái)publish你的結(jié)果。其實(shí),大家心知肚明,這種lightweight process啊,message passing concurrency啊都是Erlang的強(qiáng)項(xiàng),而且實(shí)測(cè)結(jié)果也著實(shí)頗為恐怖,一般也就沒(méi)那閑心拿別的東西來(lái)陪襯一把了(Armstrong同學(xué)自己實(shí)現(xiàn)了一個(gè)Java version,效率大約能差到百倍吧)。不過(guò)還真有那寫不信邪的老大,用stackless python實(shí)現(xiàn)了同樣的ring benchmark,發(fā)現(xiàn)比erlang還快...后來(lái)修改代碼去掉io操作,Erlang倒是比stackless python快些,但也只是一些而已。