julia - 为什么这个就地分配会分配更多内存?

标签 julia

我试图更好地理解内存管理。我有以下示例代码:

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/

相关文章:

dataframe - 按条件删除组

package - 在 Julia 中导入板包

julia - 如何在 Julia 中将二维数组转换为一维数组

upgrade - 如何将 Julia 升级到 v0.5.0?

performance - Julia 比Java慢得多

vector - 与 Julia 中的转置不同的单例向量

c# - 将 Julia 嵌入到 C# : Garbage Collector Rewrite into C# Issues and Questions

string - 如何在 Julia 中用零填充格式化整数?

c - Julia 的消息处理程序

string - 在 Julia 中用不同的字符串替换相同字符串的匹配巴黎