Ce qui suit est une fonction erlang. Je ne comprends pas comment les listes: fonction de carte est utilisée ici. Quelqu'un pourrait-il expliquer?comment utiliser les listes erlang: fonction de carte
% 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) }.
Merci.
également, je ne connais pas la syntaxe correcte lors de l'utilisation de cette fonction. Par exemple, j'ai une fonction dummy() prendre 1 paramètre. J'ai une erreur en essayant de chronométrer la fonction dummy.
moduleName:time_it(moduleName:dummy/1, 10, 100).
ci-dessus serait d'évaluer l'expression illégale.
En fait, maintenant avec la syntaxe correcte, la fonction peut être invoquée correctement:
moduleName:time_it(fun moduleName:dummy/1, 10, 100).
Cependant, il lancera une exception en disant invoquant la fonction fictive sans passer aucun paramètre. Je pense que cette ligne est le méchant, [ G() || _ <- NN ],
Je n'ai aucune idée de comment le réparer.
Ce qui est la raison de 'G = fun() -> F(), ok end' au lieu d'appeler directement' F() 'NN fois? – Zed
Ma première estimation était que c'était une optimisation erronée de "jeter" la sortie de F() au cas où en l'accumulant dans la compréhension de la liste, cela ralentissait les choses. Alors j'ai essayé et ça fait une différence! Si votre F produit quelque chose comme une liste de 255 entiers, alors l'exécuter assez souvent est plus lent dans une compréhension de liste que d'appeler G(). Peut-être est-ce dû aux frais généraux de construction de la liste. Utiliser les listes: foreach est une meilleure solution - c'est beaucoup plus rapide que la compréhension de la liste, et pas besoin d'imbriquer la fonction. –