Thanks!
--Tim

On Saturday, July 9, 2016 6:40:36 AM CDT CrocoDuck O'Ducks wrote:
> Thanks!
> 
> I filed the issue right now. I will also have a deeper look at the source
> code <https://github.com/JuliaLang/julia/blob/master/base/dsp.jl>...
> although I am probably too much of a coding noob to figure out what to do
> (even with your precious hint).
> 
> On Saturday, 9 July 2016 14:15:29 UTC+1, Tim Holy wrote:
> > Looks like xcorr has a type-instability. You can see this from
> > 
> > x = rand(10 * 192000); u = rand(10 * 192000, 3);
> > su = sub(u, :, 1);
> > @code_warntype xcorr(x, su)
> > 
> > Would you mind filing an issue?
> > https://github.com/JuliaLang/julia/issues/new
> > Alternatively, if you feel up to fixing it, the hint is "don't reuse
> > variable
> > names when the type might change."
> > 
> > Best,
> > --Tim
> > 
> > On Saturday, July 9, 2016 5:01:24 AM CDT CrocoDuck O'Ducks wrote:
> > > Hi there!
> > > 
> > > I am making few experiments with simple methods. This method calculates
> > 
> > the
> > 
> > > delay between two signals (mono-dimensional arrays) using xcorr():
> > > 
> > > function finddelay{T <: Real}(x::AbstractArray{T, 1},
> > 
> > u::AbstractArray{T, 1
> > 
> > > })
> > > 
> > > # Delay as lag between cross correlation from origin of time
> > > 
> > > sₓᵤ = xcorr(x, u)
> > > 
> > > ct_idx = cld(length(sₓᵤ), 2)
> > > 
> > > _, pk_idx = findmax(sₓᵤ, 1)
> > > 
> > > δ = ct_idx - pk_idx[1]
> > > 
> > > return δ
> > > 
> > > end
> > > 
> > > Now, I would like to add a method that picks up a mono-dimensional array
> > 
> > x,
> > 
> > > a bi-dimensional array u, and then calculates the delay between x and
> > 
> > each
> > 
> > > of the columns of u.  I tried this:
> > > 
> > > function finddelay{T <: Real}(x::AbstractArray{T, 1},
> > 
> > u::AbstractArray{T, 2
> > 
> > > })
> > > 
> > > nᵤ = size(u, 2)
> > > 
> > > δ = Array(Int, 1, nᵤ)
> > > 
> > > for s = 1:nᵤ
> > > 
> > >     δ[s] = finddelay(x, u[:, s])
> > > 
> > > end
> > > 
> > > return δ
> > > 
> > > end
> > > 
> > > It works good enough, here the benchmarks:
> > > 
> > > x = rand(10 * 192000); u = rand(10 * 192000, 3)
> > > 
> > > @benchmark finddelay(x, u)
> > > ================ Benchmark Results ========================
> > > 
> > >      Time per evaluation: 1.78 s [1.65 s, 1.91 s]
> > > 
> > > Proportion of time in GC: 13.60% [10.52%, 16.69%]
> > > 
> > >         Memory allocated: 878.94 mb
> > >    
> > >    Number of allocations: 718 allocations
> > >    
> > >        Number of samples: 4
> > >    
> > >    Number of evaluations: 4
> > >  
> > >  Time spent benchmarking: 9.21 s
> > >  
> > >  
> > >  However, by reading this cool book
> > > 
> > > <https://www.packtpub.com/application-development/julia-high-performance
> > > >,
> > > 
> > > I was suggested that using Array Views through sub() should reduce
> > 
> > memory
> > 
> > > usage. So I tried it:
> > > 
> > > function finddelay{T <: Real}(x::AbstractArray{T, 1},
> > 
> > u::AbstractArray{T, 2
> > 
> > > })
> > > 
> > > nᵤ = size(u, 2)
> > > 
> > > δ = Array(Int, 1, nᵤ)
> > > 
> > > xs = sub(x, :, 1) # I need all arguments of xcorr() to be Views
> > > 
> > > for s = 1:nᵤ
> > > 
> > >     us = sub(u, :, s)
> > >     
> > >     δ[s] = finddelay(xs, us)
> > > 
> > > end
> > > 
> > > return δ
> > > 
> > > end
> > > 
> > > Which benchmarks as follows (same input arrays):
> > > 
> > > @benchmark finddelay(x, u)
> > > ================ Benchmark Results ========================
> > > 
> > >      Time per evaluation: 2.44 s [2.41 s, 2.47 s]
> > > 
> > > Proportion of time in GC: 12.55% [12.54%, 12.57%]
> > > 
> > >         Memory allocated: 1.07 gb
> > >    
> > >    Number of allocations: 17279216 allocations
> > >    
> > >        Number of samples: 3
> > >    
> > >    Number of evaluations: 3
> > >  
> > >  Time spent benchmarking: 9.93 s
> > > 
> > > I obtained the same benchmark by trying to copy the body of first method
> > 
> > in
> > 
> > > the loop of the second, adapting it to use with sub().
> > > 
> > > As such, I have few questions:
> > >    - First of all, it is good practice to nest methods like this?
> > >    - Second, why is sub associated with a huge increase in allocations?
> > 
> > Am
> > 
> > >    I doing it wrong? Or maybe it is xcorr() that needs values and cannot
> > > 
> > > work with references?


Reply via email to