Erlang使用for()vs lists:foreach

ran*_*its 4 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]).
Run Code Online (Sandbox Code Playgroud)

我的问题是处理Erlang的基本原理.看起来Joe过去常常for()会产生进程,然后lists:foreach就会死掉它们.是否有理由使用其中一个?为什么不再使用for()来迭代生成的进程列表并向它们发送消息?这里是否存在效率优化,我错过了?

nmi*_*els 7

lists:foreach为您省去了提前确定列表长度以及将其指定为参数的麻烦.该for调用需要知道过了多久做出的排行榜,所以这是必要的.for()当没有更合适的时候,它通常被用作最后的手段.

  • 此外,语言中不存在`for/3`,因此您必须自己实现它.使它成为一个有争议的问题. (4认同)