web-dev-qa-db-fra.com

Comment pouvons-nous facilement chronométrer les appels de fonction dans l'élixir?

Comment pouvons-nous facilement le temps appels de fonction dans Elixir?

Existe-t-il un commutateur caché dans IEx pour l'activer?

34
Charles Okwuagwu

Vous pouvez écrire un module1 qui peut mesurer une fonction donnée. La fonction suivante renvoie le temps d'exécution d'une fonction donnée en secondes:

defmodule Benchmark do
  def measure(function) do
    function
    |> :timer.tc
    |> elem(0)
    |> Kernel./(1_000_000)
  end
end

Utilisez-le comme ceci:

iex> Benchmark.measure(fn -> 123456*654321 end)
9.0e-6

Si vous souhaitez l'utiliser pour l'analyse comparative, il existe une autre réponse.

Une meilleure approche que la mesure du temps d'exécution d'une exécution unique consiste à mesurer les opérations par période. Cela prend le code sous test et l'exécute de manière répétée dans un délai donné. Cette méthodologie donne des résultats plus précis.

Il existe une bibliothèque appelée Benchwarmer que vous pouvez utiliser pour cela:

Ajoutez Benchwarmer à votre mix.exs

def deps do
  [ { :benchwarmer, "~> 0.0.2" } ]
end

Passez simplement une fonction en ligne:

iex> Benchwarmer.benchmark fn -> 123456*654321 end
*** #Function<20.90072148/0 in :erl_eval.expr/5> ***
1.2 sec     2M iterations   0.61 μs/op

[%Benchwarmer.Results{...}]
60
Overbryd