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? > > >
