Erlang использует for () против списков: foreach - PullRequest
4 голосов
/ 12 июля 2011

Следующий пример кода из книги 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 () снова, чтобы перебрать список порожденных процессов и отправить им сообщение? Есть ли здесь оптимизация эффективности, которую мне не хватает?

Ответы [ 2 ]

7 голосов
/ 12 июля 2011

lists:foreach избавляет вас от необходимости заранее определять длину списка и указывать его в качестве аргумента. Вызов for должен знать, как долго составлять список, поэтому это необходимо. for() обычно используется как последнее средство, когда нет ничего более подходящего.

4 голосов
/ 10 мая 2012

Для записи, еще один способ выразить for и foreach в виде списка:

для:

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

foreach:

[Pid ! die || Pid <- L]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...