如何使用erlang列表:map函数

Qui*_*ncy 9 erlang

以下是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 ],我不知道如何解决它.

sep*_*p2k 6

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)


Rob*_*ton 5

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)