La siguiente es una función de erlang. No entiendo cómo se usan las listas: función de mapa aquí. ¿Podría alguien explicar?cómo usar las listas de erlang: función de mapa
% 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) }.
Thanks.
Además, no conozco la sintaxis correcta al usar esta función. Por ejemplo, tengo una función ficticia() toma 1 parámetro. Obtengo un error al intentar cronometrar la función ficticia.
moduleName:time_it(moduleName:dummy/1, 10, 100).
lo anterior evaluarían la expresión ilegal.
En realidad, ahora con la sintaxis correcta, la función puede ser invocada correctamente con:
moduleName:time_it(fun moduleName:dummy/1, 10, 100).
Sin embargo, se producirá una excepción diciendo que invoca la función ficticia sin pasar ningún parámetro. Creo que esta línea es la villana, [ G() || _ <- NN ],
No tengo ni idea de cómo solucionarlo.
Lo que es el motivo de 'G = fun() -> F(), ok end' en lugar de llamar directamente a' F() 'NN veces? – Zed
Mi conjetura inicial fue que esta era una optimización equivocada para "tirar" la salida de F() en caso de que al acumularla en la lista de comprensión disminuyera la velocidad. ¡Así que lo probé y marca la diferencia! Si su F produce algo así como una lista de 255 enteros, entonces ejecutarla basta veces es más lento dentro de una lista de comprensión que llamar a G(). Tal vez esto se deba a la sobrecarga de la creación de la lista. Uso de listas: Foreach es una solución mejor, esto es mucho más rápido que la comprensión de la lista, y no es necesario anidar la función. –