Come possiamo facilmente tempo chiamate di funzione in elisir?Come possiamo facilmente richiamare le chiamate di funzione in elisir?
C'è qualche interruttore nascosto in IEx per abilitare questo?
Come possiamo facilmente tempo chiamate di funzione in elisir?Come possiamo facilmente richiamare le chiamate di funzione in elisir?
C'è qualche interruttore nascosto in IEx per abilitare questo?
È possibile scrivere un modulo che può misurare una determinata funzione. La seguente funzione restituisce il tempo di esecuzione di una data funzione in pochi secondi:
defmodule Benchmark do
def measure(function) do
function
|> :timer.tc
|> elem(0)
|> Kernel./(1_000_000)
end
end
usare in questo modo:
iex> Benchmark.measure(fn -> 123456*654321 end)
9.0e-6
Se si desidera utilizzare che Benchmarking, poi c'è un'altra risposta.
Un approccio migliore rispetto alla misurazione del tempo di esecuzione a esecuzione singola è la misurazione delle operazioni per periodo. Questo prende il codice sotto test e lo esegue ripetutamente entro un determinato periodo di tempo. Questa metodologia produce risultati più accurati.
C'è una libreria chiamata Benchwarmer è possibile utilizzare per questo:
Aggiungi Benchwarmer al mix.exs
def deps do
[ { :benchwarmer, "~> 0.0.2" } ]
end
semplicemente passare una funzione inline:
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{...}]
Grazie, sarebbe bello avere questa build nello strumento Iex. –
Qual è l'unità di tempo restituisce la funzione |>: timer.tc |> elem (0) |> Kernel./(1_000_000)? È microsecondi? –
La versione di Benchwarmer dovrebbe essere "~> 0.0.2" o l'installazione delle dipendenze avrà esito negativo. – bartolsthoorn
Non penso che ci sia un'opzione per farlo. Probabilmente il modo più semplice e veloce per farlo è Erlang's ['timer: tc/1-2-3'] (http://www.erlang.org/doc/man/timer.html#tc-1). – whatyouhide
@whatyouhide non sicuro di quello che sto facendo male 'IEX (54)>: timer.tc (Demo.sum 1000) ** (BadFunctionError) previsto una funzione, ha ottenuto: 500500 (stdlib) timer.erl: 165:: timer.tc/1' –
come si può vedere nella documentazione per 'timer: tc/1' ho collegato nel commento precedente, se passi solo un argomento a' timer: tc' deve essere una funzione. Il tuo esempio sarebbe ': timer.tc (fn -> Demo.sum (1000) end)'. Se vuoi passare un modulo + funzione + argomenti tripletta, vai con ': timer.tc (Demo,: sum, [1000])'. – whatyouhide