Julia 中的分析/内存分配

Lad*_*hia 2 julia

我在 Julia 中运行一个空的双循环

Ngal = 16000000
function get_vinz()
    for i in 1:5
        print(i, " ")
        for j in i:Ngal
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

@time Vinz() 的结果给了我

1 2 3 4 5   5.332660 seconds (248.94 M allocations: 4.946 GiB, 7.12% gc time)
Run Code Online (Sandbox Code Playgroud)

分配的5GB内存是做什么用的?

lon*_*000 5

罪魁祸首是全局变量的使用。您的函数调用全局变量,并且每次调用都会分配一个 Int64(64 位)。64*16000000*5/1024/1024 = 4882.8125 MiB,这似乎是您的函数不知道内部循环的大小的罪魁祸首,并且在全局范围上进行查找以检查Ngal. 它在每个循环中都会这样做。与此实现进行比较:

function get_vinz(Ngal)
    for i in 1:5
        print(i, " ")
        for j in i:Ngal
        end
    end
end
julia> @time get_vinz(Ngal)
1 2 3 4 5   0.043481 seconds (53.67 k allocations: 2.776 MiB)
Run Code Online (Sandbox Code Playgroud)

另外,在 julia 中第一次调用函数时,会被编译为机器代码,因此后续运行速度很快。再次测量时间:

julia> @time get_vinz(Ngal)
1 2 3 4 5   0.000639 seconds (50 allocations: 1.578 KiB)
Run Code Online (Sandbox Code Playgroud)

一般来说,使用全局变量是一种不好的做法。推荐的方法是将这些值传递给函数