我们如何在Elixir中轻松地计时函数调用?
IEx中是否有任何隐藏的开关可以启用此功能?
你可以编写一个模块1来测量给定函数的运行时间。下面的函数返回给定函数的运行时间(以秒为单位):
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{...}]
timer.tc
返回微秒。 - sk29910这是对一个六岁问题的答案。但我在搜索这样一个功能时遇到了这个话题,模块建议意味着可以做到:
{time, your_func_result} = :timer.tc(&your_func/arity, [your_func-args])
如果有其他人搜索这个问题,我想在这里留下一些内容。毕竟它是基于Erlang的。因此,您不必在模块中定义另一个函数等等,时间以微秒为单位。
timer:tc/1-2-3
函数。 - whatyouhideiex(54)> :timer.tc(Demo.sum 1000) ** (BadFunctionError) 预期一个函数,却得到了:500500 (stdlib) timer.erl:165: :timer.tc/1
- Charles Okwuagwutimer:tc/1
的文档中可以看到,如果您只向timer:tc
传递一个参数,那么它必须是一个函数。您的示例将是:timer.tc(fn -> Demo.sum(1000) end)
。如果您想要传递模块+函数+参数三元组,请使用:timer.tc(Demo, :sum, [1000])
。 - whatyouhide