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?
