Size: a a a

Язык программирования Julia / Julia programming language

2021 February 28

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
import Base: getindex, size, setindex!
struct LinearSubArray{T} <: AbstractVector{T}
   v::Vector{T}
   offset::Int
   len::Int
end
getindex(x::LinearSubArray, i) = @inbounds x.v[i + x.offset - 1]
setindex!(x::LinearSubArray, v, k) = @inbounds x.v[k + x.offset - 1] = v
size(x::LinearSubArray) = (x.len, )

lv = LinearSubArray(v2, 500, 1000);

julia> @btime sort!(vv) setup = (vv = deepcopy($v)) evals = 1;
 13.110 μs (0 allocations: 0 bytes)

julia> @btime sort!(vv) setup = (vv = deepcopy($lv)) evals = 1;
 12.037 μs (0 allocations: 0 bytes)
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Так что вполне та же скорость сортировки достигается.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Причем разница по сравнению с @view по сути заключалась в добавлении @inbounds.
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
По моему (скромному) опыту, если в функцию идет view, который есть ссылка на линейный кусок памяти, то есть небольшой оверхед на организацию этого view, а дальше все работает так, как с линейным куском памяти. Т.е. не должно получаться разницы массив-view. Про копирование подряд / поэлементный доступ - действительно так, упустил момент. Но если весь исходный массив предзагружается в L3 кэш, то, наверное, раница будет не такая большая. При размере 500 даблов на это можно надеятся
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
То есть, если из определения getindex/setindex! убираю inbounds, то скорость становится как у view, если добавляю, то скорость становится как у обычной сортировки.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Но при этом добавление @inbounds перед sort! ни к каким изменениям не привело.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Может быть они не пропагейтят их через view?...
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
Я надеялся, что в sort есть свои @inbounds )
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Как-то так
v = rand(100_000);
v2 = rand(200_000);
v2[50_000:149_999] .= v;
vview = @view v2[50_000:149_999];

julia> @btime sort($v);
 5.938 ms (2 allocations: 781.33 KiB)

julia> @btime sort($vview);
 5.951 ms (2 allocations: 781.33 KiB)

То есть разница минимальна, но всё ещё не в пользу view
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
lv = LinearSubArray(v2, 50_000, 100_000);

julia> @btime sort($lv);
 5.899 ms (2 allocations: 781.33 KiB)


Но тут я думаю на самом деле просто elide происходит. Скорее всего он длину как константу протягивает везде.
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
разница в пользу view у меня была на sort!
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Хотя это было бы тупо...
Можно было бы делать обычные массивы со статическим размером и получать от этого бенефиты.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Сейчас гляну с sort!
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Не, у меня всё вполне себе стабильно плохо.

julia> @btime sort!(vv) setup = (vv = deepcopy($v)) evals = 1;
 5.777 ms (0 allocations: 0 bytes)

julia> @btime sort!(vv) setup = (vv = deepcopy($lv)) evals = 1;
 5.810 ms (0 allocations: 0 bytes)

julia> @btime sort!(vv) setup = (vv1 = deepcopy($v2); vv = @view vv1[500:1499]) evals = 1;
 17.759 μs (0 allocations: 0 bytes)
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
Статические массивы это StaticArrays.jl ?
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
julia> versioninfo()
Julia Version 1.7.0-DEV.538
Commit 85354cf8ef (2021-02-15 11:47 UTC)
Platform Info:
 OS: Linux (x86_64-linux-gnu)
 CPU: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
 WORD_SIZE: 64
 LIBM: libopenlibm
 LLVM: libLLVM-11.0.1 (ORCJIT, skylake)
Environment:
 JULIA_NUM_THREADS = 4
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Не, они на стеке аллоцируются, а я имею в виду обычные массивы в куче, но с фиксированным размером.
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
Это те, в которые нельзя сделать push! ? Дайте плз ссылочку, о чем идет речь, как их делать, а то по запросу 'static size arrays julia' вылезает только StaticArrays
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Эээ... Никаких ссылок, я просто рассуждал 😊
источник

VS

Vladimir Shashkin in Язык программирования Julia / Julia programming language
Понятно
источник