Splat on a vector uses allocations and not on a tuple


#1

In the following example, I am passing a set of subscripts i, j, k of a 3-dimensional array A in the form of vector v = [i,j,k] or tuple t = (i,j,k) using a splat .... I find that A[v...] uses 2 allocations whereas A[t...] doesn’t. This leads to much slower execution of A[v...] compared to A[t...]:

julia> VERSION
v"0.7.0-DEV.82"

julia> using BenchmarkTools

julia> v = [1,2,3]; t = (1,2,3); A = rand(3,3,3);

julia> @btime $A[$v...]
  81.003 ns (2 allocations: 32 bytes)
0.9645012234582633

julia> @btime $A[$t...]
  2.266 ns (0 allocations: 0 bytes)
0.9645012234582633

Why does v... need to use allocations? Is this something that can be fixed, or there is something fundamental in vectors that requires allocations?


#2

You don’t know how long they are.