Aha! tested the same sequence in a non-REPL run and the 1st and 2nd runtimes after a `precompile` are the same.
On Wednesday, November 25, 2015 at 10:23:04 PM UTC+2, Dan wrote: > > I've managed to reproduce the timing peculiarities you described, with a > different function. In fact, I get the same first run slower behavior even > with regular functions with -no- keywords. It is almost as if `precompile` > is not doing the entire job. > Have you tried, just testing the basic precompile-1st run-2nd run timing > of a no keyword generic function? > > On Tuesday, November 24, 2015 at 9:43:41 PM UTC+2, Tim Holy wrote: >> >> I've been experimenting further with SnoopCompile and Immerse/Gadfly, >> trying to >> shave off more of the time-to-first-plot. If I pull out all the stops >> (using the >> "userimg.jl" strategy), I can get it down to about 2.5 seconds. However, >> doing >> the same plot a second time is about 0.02s. This indicates that despite >> my >> efforts, there's still a lot that's not being cached. >> >> About 0.3s of that total (not much, but it's all I have data on) can be >> observed via snooping as re-compilation of functions that you might >> imagine >> should have been precompiled. The biggest offenders are all functions >> with >> keyword arguments. In miniature, I think you can see this here: >> >> julia> function foo(X; thin=true) >> svdfact(X) >> end >> foo (generic function with 1 method) >> >> # Before compiling this, let's make sure the work compiling foo isn't >> hidden >> # by other compilation needs: >> julia> A = rand(3,3) >> 3x3 Array{Float64,2}: >> 0.57078 0.33557 0.56497 >> 0.0679035 0.944406 0.816098 >> 0.0922775 0.404697 0.0900726 >> >> julia> svdfact(A) >> Base.LinAlg.SVD{Float64,Float64,Array{Float64,2}}(3x3 Array{Float64,2}: >> -0.507226 0.861331 0.0288001 >> -0.825227 -0.475789 -0.304344 >> -0.248438 -0.178138 0.952127 , >> [1.4844598265207638,0.5068781079827415,0.19995120630810712],3x3 >> Array{Float64,2}: >> -0.248222 -0.707397 -0.661797 >> 0.873751 -0.458478 0.162348 >> 0.418264 0.537948 -0.731893) >> >> # OK, let's precompile foo >> julia> @time precompile(foo, (Matrix{Float64},)) >> 0.000469 seconds (541 allocations: 35.650 KB) >> >> julia> @time foo(A) >> 0.001174 seconds (18 allocations: 3.063 KB) >> Base.LinAlg.SVD{Float64,Float64,Array{Float64,2}}(3x3 Array{Float64,2}: >> -0.507226 0.861331 0.0288001 >> -0.825227 -0.475789 -0.304344 >> -0.248438 -0.178138 0.952127 , >> [1.4844598265207638,0.5068781079827415,0.19995120630810712],3x3 >> Array{Float64,2}: >> -0.248222 -0.707397 -0.661797 >> 0.873751 -0.458478 0.162348 >> 0.418264 0.537948 -0.731893) >> >> # Note the 2nd call is 10x faster, despite precompilation >> julia> @time foo(A) >> 0.000164 seconds (18 allocations: 3.063 KB) >> Base.LinAlg.SVD{Float64,Float64,Array{Float64,2}}(3x3 Array{Float64,2}: >> -0.507226 0.861331 0.0288001 >> -0.825227 -0.475789 -0.304344 >> -0.248438 -0.178138 0.952127 , >> [1.4844598265207638,0.5068781079827415,0.19995120630810712],3x3 >> Array{Float64,2}: >> -0.248222 -0.707397 -0.661797 >> 0.873751 -0.458478 0.162348 >> 0.418264 0.537948 -0.731893) >> >> # Note adding a keyword argument to the call causes a further 10x >> slowdown... >> julia> @time foo(A; thin=true) >> 0.014787 seconds (3.36 k allocations: 166.622 KB) >> Base.LinAlg.SVD{Float64,Float64,Array{Float64,2}}(3x3 Array{Float64,2}: >> -0.507226 0.861331 0.0288001 >> -0.825227 -0.475789 -0.304344 >> -0.248438 -0.178138 0.952127 , >> [1.4844598265207638,0.5068781079827415,0.19995120630810712],3x3 >> Array{Float64,2}: >> -0.248222 -0.707397 -0.661797 >> 0.873751 -0.458478 0.162348 >> 0.418264 0.537948 -0.731893) >> >> # ...but only for the first call >> julia> @time foo(A; thin=true) >> 0.000209 seconds (19 allocations: 3.141 KB) >> Base.LinAlg.SVD{Float64,Float64,Array{Float64,2}}(3x3 Array{Float64,2}: >> -0.507226 0.861331 0.0288001 >> -0.825227 -0.475789 -0.304344 >> -0.248438 -0.178138 0.952127 , >> [1.4844598265207638,0.5068781079827415,0.19995120630810712],3x3 >> Array{Float64,2}: >> -0.248222 -0.707397 -0.661797 >> 0.873751 -0.458478 0.162348 >> 0.418264 0.537948 -0.731893) >> >> >> Obviously the times here don't add up to much, but for a project the size >> of >> Gadfly it might matter. >> >> I should add that >> precompile(foo, (Vector{Any}, Matrix{Float64})) >> doesn't seem to do anything useful. >> >> Any ideas? >> >> Best, >> --Tim >> >