Are you saying speed drops in code you haven’t showed, that follows after
the initialization of lagcl? Exactly what is the code you’re seeing a
slowdown in doing? (You can use http://gist.github.com if the script is
long…)
// T
On Wednesday, August 27, 2014 1:41:55 AM UTC+2, K leo wrote:
Thanks for the analysis. My understanding is about the same as yours.
> But, as I described earlier, speed drops (after this initialization
> section) if I use 0.0 at the first element. That is what puzzles me.
>
> On 2014年08月26日 21:30, Tomas Lycken wrote:
> >
> > Looking at those statements with the |@time| macro will give you some
> > useful information. I did the following:
> >
> > |julia> cl = rand(485)
> > 485-element Array{Float64,1}:
> > 0.186576
> > ⋮
> > 0.299499
> >
> > julia> lagcl_precompilation_1 = [0, cl[1:end-1]]
> >
> > julia> lagcl_precompilation_2 = [0.0, cl[1:end-1]]
> >
> > julia> @time lagcl1 = [0, cl[1:end-1]]
> > elapsed time: 0.000862835 seconds (23496 bytes allocated)
> >
> > julia> @time lagcl2 = [0.0, cl[1:end-1]]
> > elapsed time: 6.5775e-5 seconds (9696 bytes allocated)
> > |
> >
> > As you can see, a lot more memory was allocated when using |0| for the
> > first element rather than |0.0|. The reason for this is that when you
> > use |0.0|, all elements are the same type (|Float64|) so Julia only
> > needs to allocate memory for the output once. I’m not 100% sure on
> > exactly which approach is actually taken for the other case, but I can
> > imagine it would be something like
> >
> > 1) allocate an array for |Int64|s, since the first element is |Int64|
> > 2) notice that the second element is not an |Int64|, so allocate an
> > array of |Any| instead (i.e. an array of pointers to the actual
> elements)
> > 3) fill the |Any| array with the data from input
> > 4) check the type of all elements, and realize that the array type can
> > be tightened to |Float64|
> > 5) Allocate space for a |Float64| array, copy all data to it and return
> it
> >
> > Julia is probably slightly smarter than this, so don’t take the above
> > description as a definitive description of how the language actually
> > works. However, just by looking at the first two steps you can see
> > that if the type of the first element is the same as the type of all
> > other elements, we’ll be able to skip a bunch of intermediate steps
> > and still get the same result: an array of |Float64|s. Of course, if
> > we only allocate and copy once, everything is going to be much faster.
> >
> > Type stability
> > <
> http://docs.julialang.org/en/latest/manual/performance-tips/#write-type-stable-functions>
>
>
> > is one of the things that many new Julians struggle with in the
> > beginning, so it’s really worth reading up on. Writing type stable
> > code is really key to utilize all the good things about Julia’s
> > performance.
> >
> > // T
> > On Tuesday, August 26, 2014 3:14:54 PM UTC+2, K leo wrote:
> >
> > julia> cl
> > 485-element Array{Float64,1}:
> > 4555.0
> > 4601.0
> > 4693.0
> > 4678.0
> > ⋮
> > 5821.0
> > 5854.0
> > 5828.0
> >
> > julia> lagcl = [0, cl[1:end-1]]
> > 485-element Array{Float64,1}:
> > 0.0
> > 4555.0
> > 4601.0
> > 4693.0
> > ⋮
> > 5842.0
> > 5821.0
> > 5854.0
> >
> > Then thinking to make the types of elements to be the same, I
> changed
> > the above to the following (notice it is 0.0 instead of 0 at the
> > first
> > element). lagcl is only a temp array in a function that is called
> > only
> > at initialization time and lagcl[1] is actually not referenced at
> > all.
> > But the speed of my app after the initialization dropped to half.
> > Nothing else was changed, and I verified it by changing 0.0 back
> > to 0 at
> > the first element. Could anyone explain?
> >
> > julia> lagcl = [0.0, cl[1:end-1]]
> > 485-element Array{Float64,1}:
> > 0.0
> > 4555.0
> > 4601.0
> > 4693.0
> > ⋮
> > 5842.0
> > 5821.0
> > 5854.0
> >
> >
>
>