Put the loop inside a function, and call @time on the function call. For me f2
below is 3x faster on julia 0.4.
--Tim
julia> a = rand(300000);
julia> w = 200;
julia> function f1(a, w)
local b
for i = 1:length(a)-w
b = a[i:i+w]
end
b
end
f1 (generic function with 1 method)
julia> function f2(a, w)
local b
for i = 1:length(a)-w
b = sub(a, i:i+w)
end
b
end
f2 (generic function with 1 method)
julia> f1(a,w);
julia> @time f1(a,w);
elapsed time: 0.990406786 seconds (614004280 bytes allocated, 82.08% gc time)
julia> f2(a,w);
julia> @time f2(a,w);
elapsed time: 0.106962692 seconds (55163280 bytes allocated, 57.32% gc time)
julia> 35976080/55163280
0.652174417474813
On Tuesday, January 06, 2015 09:17:27 AM Tomas Mikoviny wrote:
> Tim, thanks for suggestion.. To be honest I primarily work with julia 0.4
> (0.4.0-dev+2523) and do everything there first.
> Unfortunately there is no visible performance improvement (~ same
> performance) compared to 0.3.4 for this one-dimensional problem.
>
> Tomas
>
> On Tuesday, January 6, 2015 6:01:27 PM UTC+1, Tim Holy wrote:
> > SubArrays work much better in julia 0.4; on the tasks you posted, you are
> > likely to see substantially better performance.
> >
> > --Tim
> >
> > On Tuesday, January 06, 2015 08:15:03 AM Tomas Mikoviny wrote:
> > > Hi,
> > > I'm trying to optimise julia script for spectra baseline correction
> >
> > using
> >
> > > rolling ball algorithm
> > > (http://linkinghub.elsevier.com/retrieve/pii/0168583X95009086,
> > > http://cran.r-project.org/web/packages/baseline).
> > > Profiling the code showed that the most time consuming part is actually
> > > subarray pickup.
> > > I was just wondering if there is any other possible speedup for this
> > > problem?
> > >
> > > I've started initially with standard sub-indexing:
> > >
> > >
> > > a = rand(300000);
> > > w = 200;
> > >
> > >
> > >
> > > @time for i in 1:length(a)-w
> > >
> > > a[i:i+w]
> > >
> > > end
> > >
> > > elapsed time: 0.387236571 seconds (645148344 bytes allocated, 56.46% gc
> > > time)
> > >
> > >
> > >
> > > Then I've tried directly with subarray function and it improved the
> >
> > runtime
> >
> > > significantly:
> > >
> > > @time for i in 1:length(a)-w
> > >
> > > sub(a,i:i+w)
> > >
> > > end
> > >
> > > elapsed time: 0.10720574 seconds (86321144 bytes allocated, 32.13% gc
> >
> > time)
> >
> > > With approach to internally remove and add elements I've gained yet
> >
> > some
> >
> > > extra speed-up (eliminating gc):
> > >
> > > subset = a[1:1+w]
> > >
> > > @time for i in 2:length(a)-w
> > >
> > > splice!(subset,1)
> > > insert!(subset,w+1,a[i+w])
> > >
> > > end
> > >
> > > elapsed time: 0.067341484 seconds (33556344 bytes allocated)
> > >
> > >
> > > However I wonder if this is the end....
> > >
> > > And obligatory version info:
> > >
> > > Julia Version 0.3.4
> > > Commit 3392026* (2014-12-26 10:42 UTC)
> > >
> > > Platform Info:
> > > System: Darwin (x86_64-apple-darwin13.4.0)
> > > CPU: Intel(R) Core(TM) i5-4690 CPU @ 3.50GHz
> > > WORD_SIZE: 64
> > > BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Haswell)
> > > LAPACK: libopenblas
> > > LIBM: libopenlibm
> > > LLVM: libLLVM-3.3