在 BenchmarkTools.jl 设置中将多个变量绑定到副本

Binding multiple variables to copies in BenchmarkTools.jl setup

我正在尝试使用 BenchmarkTools.jl 中的 @benchmarkable 宏。在 package documentaton 中,他们解释了如何将 setup 表达式传递给 @benchmark@benchmarkable。他们还解释说这可以用于 in-place/mutating 函数以绑定输入变量的副本。

但是,我不确定如何使用 setup 表达式同时复制多个变量。

例如,假设我要对以下函数进行基准测试(实际函数无关紧要):

function my_function!(x, y)
    deleteat!(x, y .== 0)
    deleteat!(y, y .== 0)
    x .= x .* 2
end

具有以下输入:

using BenchmarkTools

a = collect(1:30)
b = rand(0:5, 30)

我想通过将 ab 的副本分别绑定到变量 yz 来执行基准测试。

t = @benchmarkable my_function!(m, n) setup=(m = copy($a), n = copy($b)) evals = 30

run(t)

但是运行前面的代码returns出现如下错误:

ERROR: LoadError: UndefVarError: m not defined

setup 需要一段代码,因此:

t =  @benchmarkable my_function!(m, n) setup=begin; m = copy($a); n = copy($b);end  evals = 30

现在你可以运行了:

julia> run(t)
BenchmarkTools.Trial: 10000 samples with 30 evaluations.
 Range (min … max):  173.333 ns … 131.320 μs  ┊ GC (min … max): 0.00% … 99.33%
 Time  (median):     210.000 ns               ┊ GC (median):    0.00%
 Time  (mean ± σ):   251.470 ns ±   1.315 μs  ┊ GC (mean ± σ):  5.19% ±  0.99%

  ▂█ ▁
  ██▇█▅▇█▅▆▃▃▃▃▃▃▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▁▂▁▁▁▂▁▂▂▂▂▂▂▂▂▂▂▂▂▂▁▂▂▂▂▂▂ ▃
  173 ns           Histogram: frequency by time          807 ns <