Как избежать выделения при доступе к структуре?Юля - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь, чтобы мой вызов функции занимал как можно меньше памяти, чтобы он работал быстрее.Проблема в том, что, когда я получаю доступ к структуре, которая указана в качестве аргумента, возникает много распределений.

function mCondition(y,t,integrator)
    xp, yp, zp, vx, vy, vz = y
    mu = integrator.p[1]
    cond = (xp - 1.0 + mu)*vx +  yp*vy + zp*vz
    return cond
end
struct myStr
    p
    u
end

y = rand(6)
t = 0.0
A = myStr([0.01215],rand(6))

#test call
mCondition(y,t,A)

using BenchmarkTools
@btime mCondition(y,t,A)

Вывод:

julia> @btime mCondition(y,t,A)
  102.757 ns (9 allocations: 144 bytes)
-0.07935578340713843

Я думаю, что проблема вструктура, потому что когда я удаляю эту часть кода,

function mCondition(y,t,integrator)
    xp, yp, zp, vx, vy, vz = y
    cond = (xp - 1.0)*vx +  yp*vy + zp*vz
    return cond
end

это результат теста:

julia> @btime mCondition(y,t,A)
  18.294 ns (1 allocation: 16 bytes)
-0.08427348469961408

, который ближе к тому, что я ожидал бы от того, что происходитвнутри функции (но мне все еще интересно, если это распределение даже необходимо).Если бы вы могли помочь мне понять, что происходит или даже исправить это, было бы неплохо.

Заранее спасибо:)

1 Ответ

0 голосов
/ 30 марта 2019

Вам необходимо ввести аннотированные определения полей в struct, чтобы компилятор мог генерировать высокопроизводительный код. Без аннотаций типов в ваших полях struct компилятор не сможет определить типы полей во время компиляции, что оставит решения во время выполнения, и, следовательно, это снизит производительность и приведет к ненужным в противном случае выделениям.

Решение тогда,

struct myStr
    p::Vector{Float64}
    u::Vector{Float64}
end

Вы также можете сделать свой параметр struct параметрическим, например, если хотите, чтобы он работал с Vector других типов. См. Типы раздел документации для получения дополнительной информации.

Я бы также предложил вам прочитать раздел документации Performance Tips , чтобы узнать больше о том, как писать высокопроизводительный код на языке Julia.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...