Assigning a Tuple to sub-entries of Tuple of Arrays

I’m distributing entries of a Tuple to the ith entry of each array in a Tuple of Arrays.

using BenchmarkTools

N = 3
X = (zeros(N),zeros(N))
Y = [1,2]
function foo1!(X,Y,i)
    for fld in eachindex(X)
        X[fld][i] = Y[fld]
    end
end
@btime foo1!($X,$Y,$1)

foo2!(x,y,i) = x[i] = y
@btime foo2!.($X,$Y,$1)

foo3!(X,Y,i) = getindex(X,i) = Y
@btime foo3!($X,$Y,$1)

Each different approach gives a different runtimes

  2.608 ns (0 allocations: 0 bytes)
  44.127 ns (1 allocation: 96 bytes)
  5.209 ns (1 allocation: 16 bytes)

Why is the second so slow, and is there a one-line approach which is as fast as the for loop?

The second also returns an array of results. You might be interested in

1 Like

Thanks! I didn’t account for the allocation of return values.