以下是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) }.
Run Code Online (Sandbox Code Playgroud)
谢谢.
另外,使用此功能时我不知道正确的语法.例如,我有一个dummy()函数取1参数.我在尝试计算虚拟函数时遇到错误.
moduleName:time_it(moduleName:dummy/1, 10, 100).
Run Code Online (Sandbox Code Playgroud)
以上将评估为非法表达.
实际上,现在使用正确的语法,可以使用以下命令正确调用该函数:
moduleName:time_it(fun moduleName:dummy/1, 10, 100).
Run Code Online (Sandbox Code Playgroud)
但是,它会抛出一个异常,即在不传递任何参数的情况下调用虚函数.我认为这条线是恶棍,[ G() || _ <- NN ],我不知道如何解决它.
map 这里用来执行该功能
T0 = now(), % start timer
[ G() || _ <- NN ], % make N calls to F
1.0e-6*timer:now_diff(now(), T0)/N % average time per call
Run Code Online (Sandbox Code Playgroud)
对于每个元素MM.map将返回相同大小的新列表,其中新列表的每个元素是将上述函数应用于相应元素的结果MM.
您可以调用time_it:
moduleName:time_it(fun moduleName:dummy/1, 10, 100).
Run Code Online (Sandbox Code Playgroud)
lists:mapintime_it函数的目的只是将内部函数运行 M 次。当您看到此模式时:
L = lists:seq(1,M),
lists:map(fun(_)-> Foo() end, L)
Run Code Online (Sandbox Code Playgroud)
它只是意味着Foo()一次又一次地调用M 次,并将每次调用的结果返回到一个列表中。它实际上制作了一个整数列表,[1,2,3,...N]然后Foo()为列表中的每个成员调用一次。
作者又time_it做了同样的把戏,因为time_it需要调用你给它 N*M 次的函数。所以在运行 M 次的外循环中,他们使用不同的技术来运行内循环 N 次:
L = lists:seq(1,N),
[Foo() || _ <- L]
Run Code Online (Sandbox Code Playgroud)
这和上面的代码有完全一样的结果,只是这次Foo被调用了 N 次。
您在使用time_it虚拟函数时遇到问题的原因是它time_it需要一个参数为 0 而不是 1 的函数。所以您需要创建一个虚拟函数并像这样调用它:
dummy() ->
%% do something here you want to measure
ok.
measure_dummy() ->
time_it(fun someModule:dummy/0, 10, 100).
Run Code Online (Sandbox Code Playgroud)