Vector of matrices vs. multidimensional arrays

Sorry to dig up an old thread, but since this was referenced in another post I figured it was worth correcting the record.

The entire difference you’re observing between the vector-of-matrix approach and the 3D array approach here is due to your vector having a non-concrete element type. Your vec_mat is of type Array{Matrix}, but Matrix is not a concrete type. You need Array{Matrix{Float64}}. Likewise for your vector-of-vectors-of-vectors approach, you need an Array{Vector{Vector{Float64}}} not Array{Vector{Vector}}.

Switching to concretely typed structures makes the 3D array and vector-of-matrix approaches perform almost exactly the same:

julia> function f(x::Array{T, 3}) where T
         x .+= 1
f (generic function with 2 methods)

julia> function f(x::Array{Matrix{T}}) where T
         for matrix in x
           matrix .+= 1
f (generic function with 2 methods)

julia> x_array = zeros(N, N, N);

julia> x_vec_mat = [zeros(N, N) for i in 1:N];

julia> using BenchmarkTools

julia> @btime f($x_array);
  609.838 μs (0 allocations: 0 bytes)

julia> @btime f($x_vec_mat);
  505.012 μs (0 allocations: 0 bytes)