comment utiliser erlang listes:fonction map

Ce qui suit est une erlang fonction. Je ne comprends pas comment faire des listes:carte fonction est utilisée ici.
Quelqu'un pourrait-il expliquer?

% 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) }.

Grâce.

aussi, je ne connais pas la syntaxe correcte lors de l'utilisation de cette fonction. Par exemple, j'ai un dummy() prise de fonction 1 paramètre. J'obtiens une erreur lors de la tentative à la fois la fonction factice.

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

ci-dessus permettrait d'évaluer à l'expression illégale.

En fait, maintenant, avec la syntaxe correcte, la fonction peut être appelée correctement avec:

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

Cependant, il va lancer une exception dire l'invocation de la fonction factice sans passer n'importe quel paramètre. Je pense que cette ligne est le méchant, [ G() || _ <- NN ], je n'ai aucune idée de comment le résoudre.

Quelle est la raison pour G = fun() -> F(), ok end au lieu de le faire directement appel F() NN fois?
Mon estimation initiale était que c'était une erreur d'optimisation afin de "jeter" la sortie de F() dans le cas accumuler dans la compréhension de liste il a ralenti les choses. Donc je l'ai essayé et cela fait une différence! Si votre F sorties quelque chose comme une liste de 255 entiers, puis en exécutant un certain nombre de fois est plus lent à l'intérieur d'une compréhension de liste de l'appel de G(). C'est peut-être en raison de la surcharge de la constitution de la liste. À l'aide de listes:foreach est une meilleure solution - c'est beaucoup plus rapide que la compréhension de liste, et pas besoin de nid de la fonction.

OriginalL'auteur Quincy | 2009-10-10