Yeah, this definitely matters for performance. It is a real shame since the 
generators are so elegant to use.

inner1(R, i) = sum( R[j,i] for j = 1:size(R,1) )
inner2(R, i) = sum( [R[j,i] for j = 1:size(R,1)] )
    
function test(R, inner)
    n = [ inner(R, i)^2 for i = 1:size(R,2) ]
    N = length(n)
    s = 0.0
    for i = 1:N, j = max(1, i-5):min(N, i+5)
        s += n[i] * n[j]
    end 
    return s
end 
    
R = rand(10, 1000);


@time test(R, inner1)
@time test(R, inner1)
@time test(R, inner1)  
#   0.002539 seconds (76.02 k allocations: 1.396 MB)
#   0.002264 seconds (76.02 k allocations: 1.396 MB)
#   0.002094 seconds (76.02 k allocations: 1.396 MB)


@time test(R, inner2)
@time test(R, inner2)
@time test(R, inner2)
#   0.000131 seconds (4.01 k allocations: 242.547 KB)
#   0.000106 seconds (4.01 k allocations: 242.547 KB)
#   0.000104 seconds (4.01 k allocations: 242.547 KB)



Reply via email to