我最近发现两个宏之间存在巨大差异:@benchmark和@time在内存分配信息和时间方面.例如:
@benchmark quadgk(x -> x, 0., 1.)
BenchmarkTools.Trial:
memory estimate: 560 bytes
allocs estimate: 17
--------------
minimum time: 575.890 ns (0.00% GC)
median time: 595.049 ns (0.00% GC)
mean time: 787.248 ns (22.15% GC)
maximum time: 41.578 ?s (97.60% GC)
--------------
samples: 10000
evals/sample: 182
@time quadgk(x -> x, 0., 1.)
0.234635 seconds (175.02 k allocations: 9.000 MiB)
(0.5, 0.0)
Run Code Online (Sandbox Code Playgroud)
为什么这两个例子之间有很大的不同?
一方面,如果我有x=[1,2,3],则无法添加"foo"到x,但是如果我以开头x=[1,2,3,"foo"],则联合类型为Any,则可以将所需的内容添加到数组中。说Julia数组是齐次的是否正确?因为我可以创建的数组Any。
我正在尝试在数组X中搜索所需的模式(变量模板).模板的长度为9.
我做的事情如下:
function check_alloc{T <: ZeroOne}(x :: AbstractArray{T}, temp :: AbstractArray{T})
s = 0
for i in 1 : 1000
myView = view(x, i : i + 9)
if myView == temp
s += 1
end
end
return s
end
Run Code Online (Sandbox Code Playgroud)
并在此短循环中获得意外的内存分配(46 KB).为什么会发生这种情况?如何防止内存分配和性能下降?