2

I am just starting to evaluate Julia (version 0.6.0) and I tested how resize! and sizehint! could impact performance. I used @time macro.

Documentation says "# Run once to JIT-compile" but it seems that running once could not be enough if we check number of allocations.

module Test

function test(x::Int64; hint::Bool=false, resize::Bool=false)
    A::Array{Int64} = []
    n::Int64 = x
    if resize
        resize!(A, n)
        for i in 1:n
            A[i]=i
        end
    else
        if hint sizehint!(A, n) end
        for i in 1:n
            push!(A, i)
        end
    end
    A[end]
end

end

import Test

#Test.test(1);  # (1)
#Test.test(1, hint=true);  # (2)
#Test.test(1, resize=true);  # (3)
@time Test.test(10_000_000)
@time Test.test(10_000_000, hint=true)
@time Test.test(10_000_000, resize=true)

I got different results for different "JIT-precompile" callings:

Result from code above:

    0.494120 seconds (11.02 k allocations: 129.706 MiB, 22.77% gc time)
    0.141155 seconds (3.43 k allocations: 76.537 MiB, 41.94% gc time)
    0.068319 seconds (9 allocations: 76.294 MiB, 76.99% gc time)

If (1) is uncommented:

    0.520939 seconds (112 allocations: 129.007 MiB, 21.79% gc time)
    0.140845 seconds (3.43 k allocations: 76.537 MiB, 42.35% gc time)
    0.068741 seconds (9 allocations: 76.294 MiB, 77.55% gc time)

if (1) && (2) are uncommented:

    0.586479 seconds (112 allocations: 129.007 MiB, 19.28% gc time)
    0.117521 seconds (9 allocations: 76.294 MiB, 50.56% gc time)
    0.068275 seconds (9 allocations: 76.294 MiB, 76.84% gc time)

if (1) && (2) && (3) are uncommented:

    0.509668 seconds (112 allocations: 129.007 MiB, 21.61% gc time)
    0.112276 seconds (9 allocations: 76.294 MiB, 50.58% gc time)
    0.065123 seconds (9 allocations: 76.294 MiB, 76.34% gc time)

if (3) is uncommented:

    0.497802 seconds (240 allocations: 129.016 MiB, 22.53% gc time)
    0.117035 seconds (11 allocations: 76.294 MiB, 52.56% gc time)
    0.067170 seconds (11 allocations: 76.294 MiB, 76.93% gc time)

My questions:

  1. Is it bug?
  2. If it is not bug then is there possibility to invoke complete compilation?

1 Answer 1

3

No, the doc here clearly tells this is due to you were running @time in global scope:

julia> function foo()
          Test.test(1)  # warm-up
          @time Test.test(10_000_000)
          @time Test.test(10_000_000, hint=true)
          @time Test.test(10_000_000, resize=true)
       end
foo (generic function with 1 method)

julia> foo()
  0.401256 seconds (26 allocations: 129.001 MiB, 47.38% gc time)
  0.185094 seconds (6 allocations: 76.294 MiB, 37.13% gc time)
  0.034649 seconds (6 allocations: 76.294 MiB, 30.99% gc time)
Sign up to request clarification or add additional context in comments.

2 Comments

thanks for quick and helpful answer! :) Including test into function clearly help to solve problem. Could you be please more specific and copy+paste words where doc clearly described this behavior?
above the second code block: "As a teaser, an improved version of this function allocates no memory (the allocation reported below is due to running the @time macro in global scope) and has an order of magnitude faster execution after the first call:"

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.