我刚刚开始评估 Julia(版本 0.6.0),并且测试了如何调整大小!和尺寸提示!可能会影响性能。我使用@time宏。
文档说“#运行一次进行 JIT 编译”,但如果我们检查分配数量,运行一次似乎还不够。
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)
我的问题:
- 这是错误吗?
- 如果不是 bug 那么是否有可能调用完整的编译?
最佳答案
不,医生 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)
关于Julia JIT 编译、@time 和分配数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46262696/