2011-07-11 2 views
4

Следующий пример кода из программирования Erlang книги Джо Армстронг: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]). 

Мой вопрос имеет дело с основами Эрланга. Похоже, что Джо использовал for() для процессов порождения, а затем lists:foreach, чтобы умереть. Есть ли причина использовать один над другим? Почему бы не использовать for() снова для перебора списка порожденных процессов и отправки им сообщения о смерти? Есть ли оптимизация эффективности здесь, что мне не хватает?

ответ

7

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

+4

Кроме того, 'for/3' не существует в языке, поэтому вам придется реализовать его самостоятельно. Делает это спорным вопросом. –

4

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

для:

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

Еогеасп:

[Pid ! die || Pid <- L]

Смежные вопросы