N is a mutable global, that means that any piece of code anywhere can 
change it, so every use has to test its type, which takes time.  Making it 
const means it can't change, so its type can't change.

Cheers
Lex

On Tuesday, 22 December 2015 09:35:30 UTC+10, Joaquim Masset Lacombe Dias 
Garcia wrote:
>
> Const made the big difference, 
> But what is the problem with the inferred type? 
>
> Joaquim 
>
> > On 21 de dez de 2015, at 20:30, Milan Bouchet-Valat <[email protected] 
> <javascript:>> wrote: 
> > 
> > Le lundi 21 décembre 2015 à 14:04 -0800, Joaquim Masset Lacombe Dias 
> > Garcia a écrit : 
> >> Why is the order of these loops barely affects the time? 
> > Before doing this kind of comparison, you should ensure your code is 
> > written to run efficiently. For that, you need to do 
> > const N = 100 
> > 
> > Else, the type of the variables isn't correctly inferred. Also, you 
> > need to call the functions once to exclude compilation time from the 
> > measurement. 
> > 
> > After changing this (and fixing the name of the second argument for 
> > cba), I get the maximum time difference between abc and cba, the latter 
> > being 3x faster than the former (4x after adding @inbounds). 
> > 
> > 
> > Regards 
> > 
> > 
> >> N=100 
> >> x=rand(N,N,N) 
> >> y=rand(N,N,N) 
> >> 
> >> function abc(x::Array{Float64,3},y::Array{Float64,3}) 
> >>    for a=1:N 
> >>        for b=1:N 
> >>            for c=1:N 
> >>                y[a,b,c]=x[a,b,c] 
> >>            end 
> >>        end 
> >>    end 
> >> end 
> >> function acb(x::Array{Float64,3},y::Array{Float64,3}) 
> >>    for a=1:N 
> >>        for c=1:N 
> >>            for b=1:N 
> >>                y[a,b,c]=x[a,b,c] 
> >>            end 
> >>        end 
> >>    end 
> >> end 
> >> function bac(x::Array{Float64,3},y::Array{Float64,3}) 
> >>    for b=1:N 
> >>        for a=1:N 
> >>            for c=1:N 
> >>                y[a,b,c]=x[a,b,c] 
> >>            end 
> >>        end 
> >>    end 
> >> end 
> >> function bca(x::Array{Float64,3},y::Array{Float64,3}) 
> >>    for b=1:N 
> >>        for c=1:N 
> >>            for a=1:N 
> >>                y[a,b,c]=x[a,b,c] 
> >>            end 
> >>        end 
> >>    end 
> >> end 
> >> function cab(x::Array{Float64,3},y::Array{Float64,3}) 
> >>    for c=1:N 
> >>        for a=1:N 
> >>            for b=1:N 
> >>                y[a,b,c]=x[a,b,c] 
> >>            end 
> >>        end 
> >>    end 
> >> end 
> >> function cba(x::Array{Float64,3},xx::Array{Float64,3}) 
> >>    for c=1:N 
> >>        for b=1:N 
> >>            for a=1:N 
> >>                y[a,b,c]=x[a,b,c] 
> >>            end 
> >>        end 
> >>    end 
> >> end 
> >> 
> >> @time abc(x,y) 
> >> @time acb(x,y) 
> >> @time bac(x,y) 
> >> @time bca(x,y) 
> >> @time cab(x,y) 
> >> @time cba(x,y) 
>

Reply via email to