On Thu, Jun 9, 2016 at 6:36 PM, Arch Robison <arch.d.robi...@gmail.com> wrote: > > > The following example exhibits performance that is counter-intuitive to me. > Why?
I believe this is https://github.com/JuliaLang/julia/issues/12219 > > type fast > x > end > > type slow > x :: Unsigned > end > > function flog(y) > s = 0.0 > for i=1:1000000 > s += sqrt(y.x) > end > s > end > > for i=1:3 > @time flog(fast(42)) > @time flog(slow(42)) > end > > Here is the output I get: > $ julia sq.jl > 0.088505 seconds (2.00 M allocations: 30.519 MB, 38.67% gc time) > 0.803340 seconds (3.00 M allocations: 45.784 MB, 3.86% gc time) > 0.048212 seconds (2.00 M allocations: 30.518 MB, 4.71% gc time) > 0.770123 seconds (3.00 M allocations: 45.776 MB, 0.25% gc time) > 0.047239 seconds (2.00 M allocations: 30.518 MB, 2.01% gc time) > 0.769541 seconds (3.00 M allocations: 45.776 MB, 0.25% gc time) > > It shows that the "fast" structure makes the code run significantly faster. > That seems backwards. I was expecting that with the "Unsigned" type > assertion, the compiler might be able to deduce that sqrt will always return > a Float64, or at least narrow down the dispatch choices. But as the times > show, the type assertion makes the code run much slower. What's going on? > > Yes, I know if I declare x with a concrete type such as Int, the code will > do blazingly fast. But I was poking around to see if declaring it with an > abstract type narrower than Any would help. >