Hi:

I've noticed that there is a performance cost associated with assigning a 
value to an array in a loop, compared to just using it for calculation. 
Here are some examples to demonstrate:

function mytest(a::Array{Float64,1},b::Array{Float64,1})
    k=0.0
    for i=1:length(a)
        @inbounds k+=b[i]
    end
    
    nothing 
end

function mytest2(a::Array{Float64,1},b::Array{Float64,1})
    
    for i=1:length(a)
        @inbounds a[i]+=b[i]
    end
    
    nothing 
end

function mytest3(a::Array{Float64,1},b::Array{Float64,1})
    
    for i=1:length(a)
        @inbounds a[1]+=b[i]
    end
    
    nothing 
end

function mytest4(a::Array{Float64,1},b::Array{Float64,1})
   
    for i=1:length(a)
        @inbounds setindex!(a,b[i]+a[i],i)
    end
    
    nothing
    
end

c=rand(Float64,100000); d=rand(Float64,100000);

@time mytest(c,d);
@time mytest2(c,d);
@time mytest3(c,d);
@time mytest4(c,d);

0.000003 seconds (4 allocations: 160 bytes)
0.000164 seconds (4 allocations: 160 bytes)
0.000183 seconds (4 allocations: 160 bytes)
0.000139 seconds (4 allocations: 160 bytes)


At first, I thought that just accessing array was more expensive than a 
single variable like k in the first example, but using the value of b[i] at 
each iteration doesn't seem to have much overhead. I expect that the 
difference between mytest2 and mytest3 is because of some caching issue 
under the hood since the beginning of one array is repeatedly indexed, 
while the location in the second array changes. I'm not sure why using 
setindex! is faster than bracketed indexes.

Anyone have any ideas of what is going on here? It is still super fast, but 
in some performance critical code where I am making multiple array 
assignments per iteration, I wouldn't mind find avoiding the expense above 
if I can.

Thanks!

Paul

Reply via email to