Профилирование / Распределение памяти в Юлии - PullRequest
1 голос
/ 29 октября 2019

Я выполняю пустой двойной цикл в Юлии

Ngal = 16000000
function get_vinz()
    for i in 1:5
        print(i, " ")
        for j in i:Ngal
        end
    end
end

, и результат @time vinz () дает мне

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

Для чего выделено 5 ГБ памяти?

1 Ответ

3 голосов
/ 29 октября 2019

виновником является использование глобальных переменных. Ваша функция вызывает глобальную переменную, и при каждом вызове выделяется Int64 (64 бита). 64 * 16000000 * 5/1024/1024 = 4882.8125 МБ, похоже, виновник, что ваша функция не знает размер внутреннего цикла, и ищет глобальную область для проверки 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)

Кроме того, первый раз, когда функция вызывается в julia, компилируется в машинный код, поэтому последующие операции выполняются быстро. повторное измерение времени:

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

Использование глобальных переменных - плохая практика в целом. рекомендуемый способ - передать эти значения в функцию

...