我们如何轻松地为 elixir 中的函数调用计时?

How can we easily time function calls in elixir?

我们如何在 Elixir 中轻松地 time 函数调用?

IEx 中是否有任何隐藏开关可以启用此功能?

您可以编写一个模块1 来测量给定的功能。以下函数 returns 给定函数的 运行 时间(以秒为单位):

defmodule Benchmark do
  def measure(function) do
    function
    |> :timer.tc
    |> elem(0)
    |> Kernel./(1_000_000)
  end
end

这样使用:

iex> Benchmark.measure(fn -> 123456*654321 end)
9.0e-6

如果您想将其用于基准测试,还有另一个答案。

比测量单个 运行 执行时间更好的方法是测量每个时间帧的操作。这会获取被测代码并在给定的时间范围内重复执行它。这种方法可产生更准确的结果。

有一个名为 Benchwarmer 的库可供您使用:

将 Benchwarmer 添加到您的 mix.exs

def deps do
  [ { :benchwarmer, "~> 0.0.2" } ]
end

只需传递一个内联函数:

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

这是一个 6 年前的问题的答案。但是我 运行 在搜索这种功能时进入了这个主题,模块建议暗示可以这样做:

{time, your_func_result} = :timer.tc(&your_func/arity, [your_func-args])

我想我会把它放在这里以防其他人最终搜索它。毕竟下面是Erlang。所以你不必在模块等中定义另一个函数。时间以微秒为单位。