Erlang使用for()vs lists:foreach

时间:2011-07-11 21:25:15

标签: erlang

以下示例代码来自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()来迭代生成的进程列表并向它们发送消息?我缺少效率优化吗?

2 个答案:

答案 0 :(得分:7)

lists:foreach可以省去提前确定列表长度以及将其指定为参数的麻烦。 for调用需要知道列表需要多长时间,因此这是必要的。当没有更合适的时候,for()通常被用作最后的手段。

答案 1 :(得分:4)

对于记录,表达forforeach的另一种方式是列表推导:

作为

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

<强>的foreach:

[Pid ! die || Pid <- L]