Memory julia:@timev分配的字节值不同

Memory julia:@timev分配的字节值不同,memory,julia,Memory,Julia,使用“字节分配”来衡量内存使用情况是否更好?我有点惊讶,从一个调用到另一个调用,字节分配发生了变化 julia> @timev map(x->2*x, [1:100]) 0.047360 seconds (89.54 k allocations: 4.269 MiB) elapsed time (ns): 47359831 bytes allocated: 4476884 pool allocs: 89536 non-pool GC allocs:1 1-elem

使用“字节分配”来衡量内存使用情况是否更好?我有点惊讶,从一个调用到另一个调用,字节分配发生了变化

julia> @timev map(x->2*x, [1:100])
  0.047360 seconds (89.54 k allocations: 4.269 MiB)
elapsed time (ns): 47359831
bytes allocated:   4476884
pool allocs:       89536
non-pool GC allocs:1
1-element Array{StepRange{Int64,Int64},1}:
 2:2:200

julia> @timev map(x->2*x, [1:100])
  0.047821 seconds (89.56 k allocations: 4.271 MiB)
elapsed time (ns): 47820714
bytes allocated:   4478708
pool allocs:       89554
non-pool GC allocs:1
1-element Array{StepRange{Int64,Int64},1}:
 2:2:200

julia> @timev map(x->2*x, [1:100])
  0.045273 seconds (89.58 k allocations: 4.274 MiB)
elapsed time (ns): 45272518
bytes allocated:   4481108
pool allocs:       89580
non-pool GC allocs:1
1-element Array{StepRange{Int64,Int64},1}:
 2:2:200

首先,您应该阅读Julia手册的性能提示部分:

您违反了提示1:不要在全局范围内进行基准测试。一个大的危险信号应该是这个简单的操作需要4/100秒并分配4MB

对于基准测试,请始终使用BenchmarkTools.jl包。下面是使用示例

(顺便说一句,你真的想在
[1:100]
上操作吗?这是一个单元素向量,其中单元素是一个范围对象。你是否打算在
1:100
上操作,或者是
收集(1:100)
?)

正如您所看到的,运行时比您看到的运行时快了近6个数量级,并且分配是稳定的

还请注意,最后一个示例使用了
[1:100]
,它比其他示例更快,但这是因为它在做其他事情

julia> using BenchmarkTools

julia> foo(y) = map(x->2*x, y)
foo (generic function with 2 methods)

julia> v = 1:100
1:100

julia> @btime foo($v)
  73.372 ns (1 allocation: 896 bytes)

julia> v = collect(1:100);

julia> @btime foo($v);
  73.699 ns (2 allocations: 912 bytes)

julia> @btime foo($v);
  73.100 ns (2 allocations: 912 bytes)

julia> @btime foo($v);
  74.033 ns (2 allocations: 912 bytes)

julia> v = [1:100];

julia> @btime foo($v);
  55.563 ns (2 allocations: 128 bytes)