以下は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) }.
ありがとうございました。
また、私はこの機能を使用するときに正しい構文を知らない。たとえば、dummy()関数は1つのパラメータを取ります。ダミー関数を時間を計ろうとしているときにエラーが発生します。
moduleName:time_it(moduleName:dummy/1, 10, 100).
上記は不正な表現であると評価されます。
は実際には、正しい構文で、関数がで正しく呼び出すことができます。
moduleName:time_it(fun moduleName:dummy/1, 10, 100).
しかし、それは任意のパラメータを渡すことなく、ダミー関数を呼び出すと言って例外がスローされます。私はこの行が悪人だと思う、[ G() || _ <- NN ],
私はそれを修正する方法が全くわからない。
'F()' NN回を直接呼び出すのではなく、 'G = fun() - > F()、ok end'の理由は? – Zed
私が最初に推測したのは、F()の出力をリストの理解度に累積して処理を遅らせた場合の誤った最適化であるということでした。だから私はそれを試して、それは違いがあります!あなたのFが255の整数のリストのようなものを出力した場合、リストの中でG()を呼び出すよりも十分な時間を実行するのが遅くなります。おそらく、これはリストを構築するオーバーヘッドが原因です。 リストを使用する:foreachはより良い解決策です。これはリストの理解よりもはるかに高速で、関数をネストする必要はありません。 –