【问题标题】:Erlang using for() vs lists:foreachErlang 使用 for() 与列表:foreach
【发布时间】:2012-05-11 18:47:48
【问题描述】:

以下示例代码来自 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 基础知识。看起来乔使用for() 来生成进程,然后使用lists:foreach 来终止它们。有理由使用其中一个吗?为什么不再次使用 for() 来遍历生成的进程列表并向它们发送 die 消息?这里有我遗漏的效率优化吗?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    lists:foreach 省去了提前确定列表长度并将其指定为参数的麻烦。 for 调用需要知道列表的时间长度,所以它是必要的。 for() 通常在没有更合适的情况下用作最后的手段。

    【讨论】:

    • 另外,for/3 在该语言中不存在,因此您必须自己实现它。使它成为一个有争议的问题。
    【解决方案2】:

    为了记录,表达for 和foreach 的另一种方式是列表推导:

    为:

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

    foreach:

    [Pid ! die || Pid <- L]

    【讨论】:

      猜你喜欢
      • 2014-04-09
      • 2016-10-01
      • 1970-01-01
      • 2015-04-24
      • 2011-11-21
      • 2016-11-09
      • 2018-08-13
      • 1970-01-01
      • 2011-05-26
      相关资源
      最近更新 更多