I am having the following difficulty:
using BenchmarkTools, StaticArrays
struct Dataset{D, T<:Number}
data::Vector{SVector{D,T}}
end
data = Dataset([rand(SVector{3}) for i in 1:10000])
function Base.getindex(d::Dataset{D, T}, I::Range,
J::Range) where {D,T}
L = length(J)
return Base.getindex(d, I, J, Val{L}())
end
function Base.getindex(d::Dataset{D, T}, I::Range,
J::Range, ::Val{L}) where {D, T, L}
sind::SVector{L, Int} = SVector{L, Int}(J)
ret::Vector{SVector{L, T}} = Vector{SVector{L, T}}(length(I))
i::Int = 1
for k ∈ I
ret[i] = d.data[k][sind]
i += 1
end
return Dataset{L, T}(ret)
end
@btime $data[1:5, 1:2]
@btime $data[1:5, 1:2, Val{2}()]
4.223 μs (4 allocations: 240 bytes)
46.860 ns (2 allocations: 176 bytes)
I really cannot understand why the first call is 100 times slower, while the only thing it does is calculate a length
and pass a Val
.
I’d like some help understanding what is wrong. Of course, doing @code_warntype data[1:5, 1:2]
tells me that the L
variable is not inferred. But I don’t understand what else to do.