【问题标题】:Julia JIT compilation, @time and number of allocationsJulia JIT 编译、@time 和分配次数
【发布时间】:2023-03-20 11:25:01
【问题描述】:

我刚刚开始评估 Julia(版本 0.6.0)并且我测试了如何调整大小!和大小提示!可能会影响性能。我使用了@time 宏。

文档说“# Run once to JIT-compile”,但如果我们检查分配的数量,似乎只运行一次是不够的。

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)

对于不同的“JIT 预编译”调用,我得到了不同的结果:

以上代码的结果:

    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)

如果 (1) 未注释:

    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)

如果 (1) && (2) 未注释:

    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)

如果 (1) && (2) && (3) 未注释:

    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)

如果 (3) 未注释:

    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)

我的问题:

  1. 是错误吗?
  2. 如果不是错误,那么是否有可能调用完整的编译?

【问题讨论】:

    标签: julia


    【解决方案1】:

    不,文档 here 清楚地表明这是由于您在全局范围内运行 @time

    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)
    

    【讨论】:

    • 感谢您的快速和有用的回答! :) 将测试纳入功能显然有助于解决问题。您能否更具体地复制+粘贴文档明确描述此行为的文字?
    • 第二个代码块上方:“作为预告片,此函数的改进版本不分配内存(下面报告的分配是由于在全局范围内运行 @time 宏) 并且在第一次调用后执行速度提高了一个数量级:"
    猜你喜欢
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    相关资源
    最近更新 更多