How can we easily time function calls in Elixir?
Is there any hidden switch in IEx to enable this?
You can write a module1 that can measure a given function. The following function returns the runtime of a given function in seconds:
defmodule Benchmark do
def measure(function) do
function
|> :timer.tc
|> elem(0)
|> Kernel./(1_000_000)
end
end
Use it like this:
iex> Benchmark.measure(fn -> 123456*654321 end)
9.0e-6
If you want to use that for Benchmarking, then there is another answer.
A better approach than measuring single run execution time is to measure operations per timeframe. This takes the code under test and executes it repeatingly within a given timeframe. This methodology yields more accurate results.
There is a library called Benchwarmer you can use for that:
Add Benchwarmer to your mix.exs
def deps do
[ { :benchwarmer, "~> 0.0.2" } ]
end
Simply pass an inline function:
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{...}]
This is an answer to a 6 year old question. But I ran into this topic while searching for such a capability and the module suggestion implies one can do:
{time, your_func_result} = :timer.tc(&your_func/arity, [your_func-args])
Thought I would drop that here in case someone else ended up searching for this. After all it's Erlang underneath. So you don't have to define another function in a module etc. time is in microseconds.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With