2015-04-16 17 views
22

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?

+4

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

+0

@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' –

+4

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

risposta

36

È 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{...}] 
+1

Grazie, sarebbe bello avere questa build nello strumento Iex. –

+0

Qual è l'unità di tempo restituisce la funzione |>: timer.tc |> elem (0) |> Kernel./(1_000_000)? È microsecondi? –

+0

La versione di Benchwarmer dovrebbe essere "~> 0.0.2" o l'installazione delle dipendenze avrà esito negativo. – bartolsthoorn