View Source Tim (Tim v0.2.0)
Tim
the tiny timer.
Sometimes you want a simple tool to estimate execution time. Tim
can help!
explanation-and-usage
Explanation and usage
Tim
provides the macro time
that takes any valid Elixir expression and returns a map
containing several statistics for the expression's execution time, the result of the
evaluated expression, and the expression's string representation. To use
time
, require or import Tim
into your environment and pipe in the expression:
iex> require Tim
iex> 1..10
...> |> Enum.map(& &1 * 2/((1 + 10) * 10))
...> |> Enum.sum()
...> |> Tim.time()
%{
expr: "1..10 |> Enum.map(&(&1 * 2 / ((1 + 10) * 10))) |> Enum.sum()",
max: 46,
mean: 46.0,
median: 46,
min: 46,
n: 1,
result: 1.0,
unit: :microsecond
}
Actual timing statistics will vary. By default, all times are in microseconds.
The time
macro has two optional keyword arguments:
:n
- number of times the expression is executed to gather timing statistics (defaults to 1):unit
- unit of time in the reported statistics, which can be one of:microsecond
(default),:millisecond
,:second
,:minute
, or:hour
Tim
also provides an inspect
macro that applies IO.inspect
to the timing data returned
by Tim.time
, but then returns the result of the expression being timed. This allows timing
data to be captured in the middle of a pipeline. Like Tim.time
, inspect
also takes the
optional keyword arguments :n
and :unit
. Here's an example of using inspect
:
iex> require Tim
iex> :timer.sleep(1_000) |> Tim.inspect(n: 2, unit: :second)
Timing data: %{
max: 1.000952,
min: 1.00057,
unit: :second,
expr: ":timer.sleep(1000)",
n: 2,
mean: 1.000761,
median: 1.000952
}
:ok
under-the-hood
Under the hood
The body of the Tim.time
macro wraps around Erlang's :timer.tc
function that returns {<execution time in microseconds>, <result value>}
. The reason that time
is a macro is so
that the entire expression remains unevaluated until called inside :timer.tc
. To generate timing
statistics over independent executions, :timer.tc
and the expression are evaluated n
times.
Link to this section Summary
Functions
Takes an Elixir expression and returns the evaluated result while also
applying IO.inspect
to the map of timing stats.
Takes an Elixir expression and returns a map of timing stats and the evaluated result.
Link to this section Types
@type unit() :: :microsecond | :millisecond | :second | :minute | :hour
Link to this section Functions
Takes an Elixir expression and returns the evaluated result while also
applying IO.inspect
to the map of timing stats.
inspect
has the following optional keyword arguments:
:n
- number of times the expression is evaluated to build statistics; defaults to 1:unit
- unit of time for the timing statistics;:microsecond
(default) |:millisecond
|:second
|:minute
|:hour
Takes an Elixir expression and returns a map of timing stats and the evaluated result.
time
has the following optional keyword arguments:
:n
- number of times the expression is evaluated to build statistics; defaults to 1:unit
- unit of time for the timing statistics;:microsecond
(default) |:millisecond
|:second
|:minute
|:hour