Следующая функция erlang. Я не понимаю, как используются списки: функция map. Не мог бы кто-нибудь объяснить?как использовать списки erlang: функция карты
% perform M runs with N calls to F in each run.
% For each of the M runs, determine the average time per call.
% Return, the average and standard deviation of these M results.
time_it(F, N, M) ->
G = fun() -> F(), ok end,
NN = lists:seq(1, N),
MM = lists:seq(1, M),
T = lists:map(
fun(_) ->
T0 = now(), % start timer
[ G() || _ <- NN ], % make N calls to F
1.0e-6*timer:now_diff(now(), T0)/N % average time per call
end,
MM
),
{ avg(T), std(T) }.
Спасибо.
также, я не знаю правильного синтаксиса при использовании этой функции. Например, у меня есть параметр dummy(), который принимает 1 параметр. Я получаю сообщение об ошибке, пытаясь найти время для фиктивной функции.
moduleName:time_it(moduleName:dummy/1, 10, 100).
вышеуказанное оценило бы незаконное выражение.
На самом деле, теперь с правильным синтаксисом, функция может быть вызвана правильно с:
moduleName:time_it(fun moduleName:dummy/1, 10, 100).
Однако, он будет бросать исключение, говоря вызывая фиктивную функцию без прохождения какого-либо параметра. Я думаю, что эта линия - злодей, [ G() || _ <- NN ],
Я понятия не имею, как это исправить.
Что причина 'G = fun() -> F(), ok end' вместо прямого вызова' F() 'NN раз? – Zed
Моя первоначальная догадка заключалась в том, что это была ошибочная оптимизация, чтобы «выбросить» выход F(), в случае, если накопить его в понимании списка, это замедлило ситуацию. Поэтому я попробовал, и это имеет значение! Если ваш F выдает что-то вроде списка из 255 целых чисел, то выполнение его достаточно времени медленнее в понимании списка, чем вызов G(). Возможно, это связано с накладными расходами на создание списка. Использование списков: foreach - лучшее решение - это намного быстрее, чем понимание списка, и нет необходимости встраивать функцию. –