es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Rendimiento de asignación y copiado utilizando StaticArrays.jl en Julia.

Estaba pensando en usar el paquete StaticArrays.jl para mejorar el rendimiento de mi código. Sin embargo, solo uso arrays para almacenar variables calculadas y usarlas más tarde después de que se establezcan ciertas condiciones. Por lo tanto, estaba probando el tipo SizedVector en comparación con un vector normal, pero no entiendo el código a continuación. También intenté StaticVector y usé una solución alternativa con Setfield.jl.

using StaticArrays, BenchmarkTools, Setfield
function copySized(n::Int64)
    v = SizedVector{n, Int64}(zeros(n))
    w = Vector{Int64}(undef, n)
    for i in eachindex(v)
        v[i] = i
    end
    for i in eachindex(v)
        w[i] = v[i]
    end
end
function copyStatic(n::Int64)
    v = @SVector zeros(n)
    w = Vector{Int64}(undef, n)
    for i in eachindex(v)
        @set v[i] = i
    end
    for i in eachindex(v)
        w[i] = v[i]
    end
end
function copynormal(n::Int64)
    v = zeros(n)
    w = Vector{Int64}(undef, n)
    for i in eachindex(v)
        v[i] = i
    end
    for i in eachindex(v)
        w[i] = v[i]
    end
end
n = 10
@btime copySized($n)
@btime copyStatic($n)
@btime copynormal($n)

¿Por qué el caso con SizedVector tiene muchas más asignaciones y, por lo tanto, un rendimiento peor? ¿No uso SizedVector correctamente? ¿No debería tener al menos el mismo rendimiento que los arrays normales?

Gracias de antemano.

Cross post de Julia Discourse: Enlace

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La razón del mayor número de asignaciones y peor rendimiento en el caso de SizedVector se debe al hecho de que el SizedVector es un tipo inmutable. Esto significa que cada vez que se cambia un elemento en el SizedVector, se crea una nueva instancia del SizedVector. En contraste, el vector normal mutable se puede modificar en su lugar, lo que resulta en menos asignaciones y mayor rendimiento.

    En el código proporcionado, el bucle for está modificando los elementos del vector, lo que resulta en la creación de múltiples instancias de SizedVector en el caso de copySized. Por otro lado, en el caso de copyStatic, se está utilizando una solución alternativa con Setfield.jl para modificar los elementos en su lugar, lo que resulta en un mejor rendimiento.

    Si las variables calculadas solo se almacenan y no se modifican, el uso de StaticArrays.jl puede mejorar el rendimiento debido a su asignación en la pila y otras optimizaciones. Sin embargo, si las variables necesitan ser modificadas, el uso de arrays normales puede ser más rápido debido a su mutabilidad.

    En resumen, la diferencia de rendimiento entre SizedVector y el vector normal se debe a su mutabilidad e inmutabilidad, respectivamente. Para mejorar el rendimiento, se puede utilizar la solución alternativa Setfield.jl o considerar el uso de arrays mutables si las variables necesitan ser modificadas.

Comments are closed.