Search code examples
functiontimingelixir

How can we easily time function calls in elixir?


How can we easily time function calls in Elixir?

Is there any hidden switch in IEx to enable this?


Solution

  • 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{...}]