我们如何轻松地在灵药中调用函数调用?

Cha*_*gwu 30 function timing elixir

怎样才能轻松地时间功能的药剂电话?

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

Ove*_*ryd 53

您可以编写一个可以测量给定函数的模块1.以下函数以秒为单位返回给定函数的运行时:

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

像这样使用它:

iex> Benchmark.measure(fn -> 123456*654321 end)
9.0e-6
Run Code Online (Sandbox Code Playgroud)

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

比测量单次运行执行时间更好的方法是测量每个时间帧的操作.这将获取测试中的代码并在给定的时间范围内重复执行它.该方法产生更准确的结果.

你可以使用一个名为Benchwarmer的库:

将Benchwarmer添加到您的 mix.exs

def deps do
  [ { :benchwarmer, "~> 0.0.2" } ]
end
Run Code Online (Sandbox Code Playgroud)

只需传递内联函数:

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{...}]
Run Code Online (Sandbox Code Playgroud)


小智 17

这是对一个6年前的问题的回答。但我在寻找这样的功能时遇到了这个主题,并且模块建议暗示人们可以这样做:

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

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