Poniżej znajduje się funkcja erlang. Nie rozumiem, w jaki sposób używa się list: funkcja map. Czy ktoś mógłby wyjaśnić?sposób korzystania z list erlang: funkcja mapy
% 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) }.
Dzięki.
również, nie znam prawidłowej składni podczas korzystania z tej funkcji. Na przykład mam funkcję dummy() przyjmuję 1 parametr. Wystąpił błąd podczas próby wyzerowania funkcji fikcyjnej.
moduleName:time_it(moduleName:dummy/1, 10, 100).
powyższe będzie oceniać jako nielegalne wyrażenie.
Właściwie teraz z poprawną składnią, funkcja może być wywołana poprawnie:
moduleName:time_it(fun moduleName:dummy/1, 10, 100).
Będzie jednak rzucić wyjątek mówiący wywoływanie funkcji manekina bez przechodzenia dowolny parametr. Myślę, że ta linia to złoczyńca, [ G() || _ <- NN ],
Nie mam pojęcia, jak to naprawić.
Co powód "G = fun() -> F(), ok koniec" zamiast bezpośredniego wywoływania 'F()' NN razy? – Zed
Moim początkowym założeniem było to, że była to błędna optymalizacja, która "wyrzuci" wyjście F() na wszelki wypadek, gromadząc je na liście, co spowolniło. Więc spróbowałem i to robi różnicę! Jeśli twoje F wypisze coś w rodzaju listy 255 liczb całkowitych, to uruchomienie go wystarczająco długo jest wolniejsze w zrozumieniu listy niż wywołanie G(). Być może wynika to z napowietrznej budowy listy. Korzystanie z list: foreach jest lepszym rozwiązaniem - jest to znacznie szybsze niż zrozumienie listy i nie ma potrzeby zagnieżdżania funkcji. –