2011-07-11 53 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]