簡體   English   中英

如何使用erlang列表:map函數

[英]how to use erlang lists:map function

以下是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() || _ <- 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

對於MM每個元素。 map將返回相同大小的新列表,其中新列表的每個元素是將上述函數應用於MM的相應元素的結果。

您可以調用time_it如:

moduleName:time_it(fun moduleName:dummy/1, 10, 100).

lists:map的目的lists:map time_it函數中的time_it只是運行內部函數M次。 當你看到這種模式時:

L = lists:seq(1,M),
lists:map(fun(_)-> Foo() end, L)

它只是意味着一次又一次地調用Foo() M次,並在列表中返回每個調用的結果。 它實際上是一個整數列表[1,2,3,...N] ,然后為列表的每個成員調用一次Foo()
time_it的作者再次做同樣的技巧,因為time_it需要調用你給它N * M次的函數。 因此在運行M次的外循環中,他們使用不同的技術來運行內循環N次:

L = lists:seq(1,N),
[Foo() || _ <- L]

這與上面的代碼具有完全相同的結果,但這次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).

如果你有一個函數moduleName:dummy / 1,你可以執行以下操作之一

  1. 如果你可以編輯time_it/3 ,那么讓它調用F(constant_parameter)而不是F() 我認為是這種情況。
  2. 否則,調用M1:time_it(fun() -> M2:dummy(constant_parameter) end, N, M) dummy不會直接調用,而只能由time_it中的F調用。
results(N, F) when N >= 0 -> results(N, F, []).
results(0, _, Acc) -> lists:reverse(Acc);
results(N, F, Acc) -> results(N-1, F, [F() | Acc]).

repeat(0, F) -> ok;
repeat(N, F) when N > 0 ->
    F(),
    repeat(N-1, F).

用這些:

T = results(M, fun () ->
                   T0 = now(),
                   repeat(N, G),
                   1.0e-6 * timer:now_diff(now(), T0)/N
               end) 

現在有道理嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM