2011-07-11 85 views
4

下面的示例代碼是從喬·阿姆斯特朗的編程二郎書:二郎使用()VS列表:的foreach

max(N) -> 
    Max = erlang:system_info(process_list), 
    io:format("Maximum allowed processes:~p~n",[Max]), 
    statistics(runtime), 
    statistics(wall_clock), 
    L = for(1, N, fun() -> spawn(fun() -> wait() end) end), 
    {_, Time1} = statistics(runtime), 
    {_, Time2} = statistics(wall_clock), 
    lists:foreach(fun(Pid) -> Pid ! die end, L), 
    U1 = Time1 * 1000/N, 
    U2 = Time2 * 1000/N, 
    io:format("Process spawn time=~p (~p) microseconds~n", 
    [U1, U2]). 

我的問題是處理二郎基本面。它看起來像喬使用for()來產生進程,然後lists:foreach去死。是否有理由相互使用一個?爲什麼不再使用for()來迭代產生的進程列表並向它們發送一個死信息?我錯過了哪裏有效率優化?

回答

7

lists:foreach爲您節省了提前確定列表長度並將其指定爲參數的麻煩。 for調用需要知道製作列表需要多長時間,所以這是必要的。 for()通常作爲最後的手段,當沒有什麼更合適的時候。

+4

此外,'for/3'不存在於語言中,因此您必須自己實現它。使其成爲一個有爭議的問題。 –

4

根據記錄,另一種方式來表達forforeach是列表理解:

爲:

[spawn(fun() -> wait() end) || _ <- lists:seq(1, N)]

的foreach:

[Pid ! die || Pid <- L]