我试图更好地理解内存管理。我有以下示例代码:
begin
mutable struct SimplestStruct
a::Float64
end
function SimplestLoop!(a::Array{SimplestStruct, 1}, x::Float64)
for i in 1:length(a)
@inbounds a[i].a = x
end
end
simples = fill(SimplestStruct(rand()), 100)
@time SimplestLoop!(simples, 6.0)
end
据我从文档和有关就地操作的各种好帖子中可以看出,SimplestLoop!
应该对其第一个参数进行操作,而不分配任何额外的内存。但是,@time 报告了 17k 分配。
发生这种情况有明显的原因吗?
提前谢谢您!
最佳答案
如果您多次执行 @time
测量,您会发现第一次测量与其他测量不同。这是因为您实际上主要测量(提前)编译时间和内存分配。
当目标是更好地了解运行时性能时,通常建议使用 BenchmarkTools
执行基准测试:
julia> using BenchmarkTools
julia> @btime SimplestLoop!($simples, 6.0)
82.930 ns (0 allocations: 0 bytes)
BenchmarkTools 的 @btime
宏负责处理编译时间,以及对足够多的样本进行运行时测量的平均以获得准确的估计。这样,我们发现您的代码中确实没有任何分配,正如预期的那样。
关于julia - 为什么这个就地分配会分配更多内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64000636/