我们如何轻松地为 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。所以你不必在模块等中定义另一个函数。时间以微秒为单位。
我们如何在 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。所以你不必在模块等中定义另一个函数。时间以微秒为单位。