Skip to content

PMA : improve iterator performance #9

Open
@guimarqu

Description

@guimarqu

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions