JL Julia  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Аллокации и управление памятью

Профессиональные сценарии по теме «Аллокации и управление памятью» проверяют диагностику, производительность, безопасность и способность защитить архитектурное решение. Вопросы требуют читать код, находить границу применимости, выбирать проверяемую правку и отличать свойства Julia от поведения конкретного пакета. В тесте 30 вопросов: 18 заданий с кодом и 12 заданий с математической записью. Все формулировки рассчитаны на Julia 1.12.6; для сторонних библиотек используется явно названный API.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На работу отведено 85 минут. После завершения откроются правильные ответы, объяснения и результаты по темам.
Вопрос 1 из 30
Какое объяснение для `@show @allocated temporary(x)` выдержит проверку на другом допустимом входе?
B=\operatorname{allocated}(f,x)
JuliaJulia · Измерение аллокаций
using BenchmarkTools
function temporary(x)
    y = x .* 2
    z = y .+ 1
    return sum(z)
end
x = rand(10_000)
@show @allocated temporary(x)
@btime temporary($x)
Вопрос 2 из 30
Какой контрольный тест лучше всего проверит правило, связанное с `@show @allocated temporary(x)`?
JuliaJulia · Измерение аллокаций
using BenchmarkTools
function temporary(x)
    y = x .* 2
    z = y .+ 1
    return sum(z)
end
x = rand(10_000)
@show @allocated temporary(x)
@btime temporary($x)
Вопрос 3 из 30
Какое требование к `@show @allocated temporary(x)` важнее удобной детали текущей реализации?
JuliaJulia · Измерение аллокаций
using BenchmarkTools
function temporary(x)
    y = x .* 2
    z = y .+ 1
    return sum(z)
end
x = rand(10_000)
@show @allocated temporary(x)
@btime temporary($x)
Вопрос 4 из 30
Две реализации участка с `@show @allocated temporary(x)` совпадают на обычных данных. Что необходимо проверить перед выпуском?
B=\operatorname{allocated}(f,x)
Вопрос 5 из 30
Что следует сообщить пользователю библиотеки о поведении `@show @allocated temporary(x)`?
Вопрос 6 из 30
Какое утверждение точнее всего объясняет участок с `return sum(@view x[r])`?
V=\operatorname{view}(A,I)
JuliaJulia · Представления без копирования (views)
function window_sum_copy(x, r)
    return sum(x[r])
end
function window_sum_view(x, r)
    return sum(@view x[r])
end
x = rand(1_000_000)
r = 100:200
@show window_sum_copy(x, r) window_sum_view(x, r)
Вопрос 7 из 30
Какой контрольный тест лучше всего проверит правило, связанное с `return sum(@view x[r])`?
JuliaJulia · Представления без копирования (views)
function window_sum_copy(x, r)
    return sum(x[r])
end
function window_sum_view(x, r)
    return sum(@view x[r])
end
x = rand(1_000_000)
r = 100:200
@show window_sum_copy(x, r) window_sum_view(x, r)
Вопрос 8 из 30
Какую гарантию должна сохранить правка участка с `return sum(@view x[r])`?
JuliaJulia · Представления без копирования (views)
function window_sum_copy(x, r)
    return sum(x[r])
end
function window_sum_view(x, r)
    return sum(@view x[r])
end
x = rand(1_000_000)
r = 100:200
@show window_sum_copy(x, r) window_sum_view(x, r)
Вопрос 9 из 30
При переносе кода с `return sum(@view x[r])` в библиотеку какой критерий нельзя заменять впечатлением «пример работает»?
V=\operatorname{view}(A,I)
Вопрос 10 из 30
Какое ограничение стоит прямо указать в документации к участку с `return sum(@view x[r])`?
Вопрос 11 из 30
Что именно следует из фрагмента с `axes(out) == axes(x) == axes(y) || throw(DimensionMismatch())`?
M_{peak}\approx M_{buffer}+M_{state}
JuliaJulia · Предвыделение
function axpy!(out, a, x, y)
    axes(out) == axes(x) == axes(y) || throw(DimensionMismatch())
    @inbounds @simd for i in eachindex(out, x, y)
        out[i] = a*x[i] + y[i]
    end
    return out
end
x = rand(1000); y = rand(1000); out = similar(x)
@show sum(axpy!(out, 2.0, x, y))
Вопрос 12 из 30
Какую проверку стоит добавить для участка с `axes(out) == axes(x) == axes(y) || throw(DimensionMismatch())`?
JuliaJulia · Предвыделение
function axpy!(out, a, x, y)
    axes(out) == axes(x) == axes(y) || throw(DimensionMismatch())
    @inbounds @simd for i in eachindex(out, x, y)
        out[i] = a*x[i] + y[i]
    end
    return out
end
x = rand(1000); y = rand(1000); out = similar(x)
@show sum(axpy!(out, 2.0, x, y))
Вопрос 13 из 30
Какой контракт следует закрепить при переработке строки `axes(out) == axes(x) == axes(y) || throw(DimensionMismatch())`?
JuliaJulia · Предвыделение
function axpy!(out, a, x, y)
    axes(out) == axes(x) == axes(y) || throw(DimensionMismatch())
    @inbounds @simd for i in eachindex(out, x, y)
        out[i] = a*x[i] + y[i]
    end
    return out
end
x = rand(1000); y = rand(1000); out = similar(x)
@show sum(axpy!(out, 2.0, x, y))
Вопрос 14 из 30
Две реализации участка с `axes(out) == axes(x) == axes(y) || throw(DimensionMismatch())` совпадают на обычных данных. Что необходимо проверить перед выпуском?
M_{peak}\approx M_{buffer}+M_{state}
Вопрос 15 из 30
Какое утверждение о `axes(out) == axes(x) == axes(y) || throw(DimensionMismatch())` является переносимым правилом, а не особенностью одного запуска?
Вопрос 16 из 30
Какое объяснение для `length(c.data) >= c.limit && delete!(c.data, first(keys(c.data)))` выдержит проверку на другом допустимом входе?
reachable(o)\Rightarrow o\text{ не собирается}
JuliaJulia · Жизненный цикл объектов
mutable struct Cache
    data::Dict{Int,Vector{Float64}}
    limit::Int
end
function insert!(c, key, value)
    length(c.data) >= c.limit && delete!(c.data, first(keys(c.data)))
    c.data[key] = value
end
cache = Cache(Dict(), 2)
Вопрос 17 из 30
Какую проверку стоит добавить для участка с `length(c.data) >= c.limit && delete!(c.data, first(keys(c.data)))`?
JuliaJulia · Жизненный цикл объектов
mutable struct Cache
    data::Dict{Int,Vector{Float64}}
    limit::Int
end
function insert!(c, key, value)
    length(c.data) >= c.limit && delete!(c.data, first(keys(c.data)))
    c.data[key] = value
end
cache = Cache(Dict(), 2)
Вопрос 18 из 30
Что должно остаться истинным после рефакторинга участка с `length(c.data) >= c.limit && delete!(c.data, first(keys(c.data)))`?
JuliaJulia · Жизненный цикл объектов
mutable struct Cache
    data::Dict{Int,Vector{Float64}}
    limit::Int
end
function insert!(c, key, value)
    length(c.data) >= c.limit && delete!(c.data, first(keys(c.data)))
    c.data[key] = value
end
cache = Cache(Dict(), 2)
Вопрос 19 из 30
Как проверить, что новая реализация `length(c.data) >= c.limit && delete!(c.data, first(keys(c.data)))` не изменила обещанное пользователю поведение?
reachable(o)\Rightarrow o\text{ не собирается}
Вопрос 20 из 30
Что следует сообщить пользователю библиотеки о поведении `length(c.data) >= c.limit && delete!(c.data, first(keys(c.data)))`?
Вопрос 21 из 30
Какой механизм Julia определяет поведение строки `out = Vector{Vector{Float64}}(undef, n)`?
B=\sum_s B_s
JuliaJulia · Профилирование решения
using Profile
function allocate_many(n)
    out = Vector{Vector{Float64}}(undef, n)
    for i in 1:n
        out[i] = rand(i % 100 + 1)
    end
    return out
end
Profile.Allocs.clear(); Profile.Allocs.@profile sample_rate=1.0 allocate_many(1000)
@show length(Profile.Allocs.fetch().allocs)
Вопрос 22 из 30
Какой тест точнее всего зафиксирует границу поведения `out = Vector{Vector{Float64}}(undef, n)`?
JuliaJulia · Профилирование решения
using Profile
function allocate_many(n)
    out = Vector{Vector{Float64}}(undef, n)
    for i in 1:n
        out[i] = rand(i % 100 + 1)
    end
    return out
end
Profile.Allocs.clear(); Profile.Allocs.@profile sample_rate=1.0 allocate_many(1000)
@show length(Profile.Allocs.fetch().allocs)
Вопрос 23 из 30
Какую гарантию должна сохранить правка участка с `out = Vector{Vector{Float64}}(undef, n)`?
JuliaJulia · Профилирование решения
using Profile
function allocate_many(n)
    out = Vector{Vector{Float64}}(undef, n)
    for i in 1:n
        out[i] = rand(i % 100 + 1)
    end
    return out
end
Profile.Allocs.clear(); Profile.Allocs.@profile sample_rate=1.0 allocate_many(1000)
@show length(Profile.Allocs.fetch().allocs)
Вопрос 24 из 30
После обновления Julia или пакета поведение участка с `out = Vector{Vector{Float64}}(undef, n)` изменилось. Какой критерий приёмки остаётся корректным?
B=\sum_s B_s
Вопрос 25 из 30
Какое ограничение стоит прямо указать в документации к участку с `out = Vector{Vector{Float64}}(undef, n)`?
Вопрос 26 из 30
Какой механизм Julia определяет поведение строки `y = copy(x)`?
C=\alpha T+\beta M+\gamma R
JuliaJulia · Архитектурные компромиссы
function normalized_copy(x)
    y = copy(x)
    y ./= maximum(abs, y)
    return y
end
function normalized!(x)
    x ./= maximum(abs, x)
    return x
end
x = rand(1000)
@show sum(normalized_copy(x)) sum(normalized!(copy(x)))
Вопрос 27 из 30
Какой контрольный тест лучше всего проверит правило, связанное с `y = copy(x)`?
JuliaJulia · Архитектурные компромиссы
function normalized_copy(x)
    y = copy(x)
    y ./= maximum(abs, y)
    return y
end
function normalized!(x)
    x ./= maximum(abs, x)
    return x
end
x = rand(1000)
@show sum(normalized_copy(x)) sum(normalized!(copy(x)))
Вопрос 28 из 30
Что должно остаться истинным после рефакторинга участка с `y = copy(x)`?
JuliaJulia · Архитектурные компромиссы
function normalized_copy(x)
    y = copy(x)
    y ./= maximum(abs, y)
    return y
end
function normalized!(x)
    x ./= maximum(abs, x)
    return x
end
x = rand(1000)
@show sum(normalized_copy(x)) sum(normalized!(copy(x)))
Вопрос 29 из 30
После обновления Julia или пакета поведение участка с `y = copy(x)` изменилось. Какой критерий приёмки остаётся корректным?
C=\alpha T+\beta M+\gamma R
Вопрос 30 из 30
Как сформулировать границу механизма `y = copy(x)` без чрезмерного обещания?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу