以下示例代码来自Joe Armstrong的Programming Erlang书籍:
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]).
我的问题是处理Erlang的基本原理。看起来Joe使用for()
来生成进程,然后使用lists:foreach
来消除它们。是否有理由使用其中一个?为什么不再使用for()来迭代生成的进程列表并向它们发送消息?我缺少效率优化吗?
答案 0 :(得分:7)
lists:foreach
可以省去提前确定列表长度以及将其指定为参数的麻烦。 for
调用需要知道列表需要多长时间,因此这是必要的。当没有更合适的时候,for()
通常被用作最后的手段。
答案 1 :(得分:4)
对于记录,表达for
和foreach
的另一种方式是列表推导:
作为
[spawn(fun() -> wait() end) || _ <- lists:seq(1, N)]
<强>的foreach:
[Pid ! die || Pid <- L]