'Binding multiple variables to copies in BenchmarkTools.jl setup

I am trying to use the @benchmarkable macro from BenchmarkTools.jl. In the package documentaton they explain how to pass setup expressions to @benchmark and @benchmarkable. They also explain that this can be used for in-place/mutating functions in order to bind copies of the input variables.

I am not sure, however, how to use the setup expression to copy multiple variables at the same time.

For example, imagine I want to benchmark the following function (the actual function is irrelevant):

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

With the following inputs:

using BenchmarkTools

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

I would like to perform the benchmark by binding a copy of a and b to variables y and z respectively.

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

run(t)

However, running the previous code returns the following error:

ERROR: LoadError: UndefVarError: m not defined


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source