DynamicSparseArrays.jl icon indicating copy to clipboard operation
DynamicSparseArrays.jl copied to clipboard

PMA : improve iterator performance

Open guimarqu opened this issue 5 years ago • 0 comments

PMA is a vector, iterating over its element is the same as doing :

function getsum2(vector::PackedMemoryArray)
    vector_sum = 0.0
    id_sum = 0
    for elem in vector.array
        if elem !== nothing
            id, value = elem
            vector_sum += value
            id_sum += id.uid
        end
    end
    return vector_sum
end

I timed the loop over a Vector{Tuple{Id, Float64}}, PMA, and Vector{Union{Nothing, Tuple{Id, Float64}} and indeed, the loop over the Vector{Tuple{Int, Float64}} is the fastest.

EDIT : test on julia1.4

  1.218 μs (0 allocations: 0 bytes). #vector
  11.730 μs (0 allocations: 0 bytes). #pma (getsum)
  10.820 μs (0 allocations: 0 bytes). #pma (getsum2)

First reason :

length(pairvector) = 1000
length(vvector.array) = 2048

So we are 5 times slower than the Vector{Tuple{Id, Float64}}

~~So it's slower because we use Vector{Union{Tuple{Id, Float64}, Nothing} and we have to test if elem !== nothing at each iteration. But there may be room for improvement.~~

EDIT : time to iterate over Vector{Tuple{Id, Float64}} and Vector{Union{Nothing, Tuple{Id, Float64}} are almost the same in Julia 1.3.

from discussion with @rrsadykov

Code : auxtest.txt

guimarqu avatar Jun 10 '20 16:06 guimarqu