The following standalone version recovers the speed of `test2` using the @fastmath macro. Integer exponents have trade-offs in implementation using repeated squaring and multiplication and intrinsic power instructions. Not really sure how to control the implementation used in every instance.
function test3(N) r = 0.234; s = 0.0 for n = 1:N s += @fastmath r^3 + r^5 end return s end On Tuesday, August 2, 2016 at 12:33:24 AM UTC-4, Christoph Ortner wrote: > > Below are two tests, in the first a simple polynomial is "hard-coded", in > the second it is passed as a function. I would expect the two to be > equivalent, but the second case is significantly faster. Can anybody > explain what is going on? @code_warntype doesn't show anything that would > explain it? > > function test1(N) > > r = 0.234; s = 0.0 > for n = 1:N > s += r^3 + r^5 > end > return s > end > > > function test2(N, f1) > r = 0.234; s = 0.0 > for n = 1:N > s += f1(r) > end > return s > end > > > g1(r) = r^3 + r^5 > > > test1(10) > test2(10, g1) > > > println("Test1: hard-coded functions") > @time test1(1_000_000) > @time test1(1_000_000) > @time test1(1_000_000) > > > println("Test2: pass functions") > @time test2(1_000_000, g1) > @time test2(1_000_000, g1) > @time test2(1_000_000, g1) > > > > > # $ julia5 weird_test2.jl > # Test1: hard-coded functions > # 0.086683 seconds (4.00 M allocations: 61.043 MB, 50.75% gc time) > # 0.142487 seconds (4.00 M allocations: 61.035 MB, 76.91% gc time) > # 0.025388 seconds (4.00 M allocations: 61.035 MB, 4.28% gc time) > # Test2: pass functions > # 0.000912 seconds (5 allocations: 176 bytes) > # 0.000860 seconds (5 allocations: 176 bytes) > # 0.000846 seconds (5 allocations: 176 bytes) > > > > > >