Hi,
while updating a package of mine I stumbled into what I think is a regression associated to indexing a reinterpret
ed array. Basically I have a custom array-like type as
struct MyArray{T<:Real, V1<:AbstractArray{Complex{T}}, V2<:AbstractArray{T}}
data::V1
linear_data::V2
function MyArray(data::AbstractArray{Complex{T}}) where {T}
linear_data = reinterpret(T, data)
new{T, typeof(data), typeof(linear_data)}(data, linear_data)
end
end
where the second field holds a linear view
of the first. I then implement indexing for this type, like
Base.@propagate_inbounds @inline getindex(a::MyArray, i) = (@inbounds ret = a.linear_data[i]; ret)
and so on for setindex!
.
A much more complicated code using this type is now significantly (4x) slower on v0.7 than it was on v0.6. Profiling the code shows that quite a bit of time is spent in indexing the new ReinterpretArray
type, that is returned in v0.7 from reinterpret(T, data)
.
A quick test on the REPL shows that on 2 days old master
using BenchmarkTools
julia> a = im*[1.0, 2.0, 3.0]
3-element Array{Complex{Float64},1}:
0.0 + 1.0im
0.0 + 2.0im
0.0 + 3.0im
julia> b = reinterpret(Float64, a)
6-element reinterpret(Float64, ::Array{Complex{Float64},1}):
0.0
1.0
0.0
2.0
0.0
3.0
julia> @btime @inbounds getindex($b, 1)
7.791 ns (0 allocations: 0 bytes)
0.0
while on v0.6 I get
julia> a = im*[1.0, 2.0, 3.0]
3-element Array{Complex{Float64},1}:
0.0+1.0im
0.0+2.0im
0.0+3.0im
julia> b = reinterpret(Float64, a)
6-element Array{Float64,1}:
0.0
1.0
0.0
2.0
0.0
3.0
julia> @btime @inbounds getindex($b, 1)
1.276 ns (0 allocations: 0 bytes)
Is this worth reporting?