I get timing/allocations the other way around. (test1, hard-coded version
is fast without allocation)
@code_warntype for test2 shows type-instability for s (because return type
cannot be inferred for f1)
On Tuesday, August 2, 2016 at 2:33:24 PM UTC+10, 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)
>
>
>
>
>
>