以下是erlang函数。我不明白在这里如何使用list:map函数。 有人能解释一下吗?如何使用erlang列表:map函数
% 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是一个更好的解决方案 - 这比列表理解快得多,并且不需要嵌套函数。 –