Size: a a a

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

2020 February 04

FO

FORTRAN ONE LOVE in Язык программирования Julia / Julia programming language
источник

FO

FORTRAN ONE LOVE in Язык программирования Julia / Julia programming language
Вот прям ваш случай)
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Михаил Горлатов
По крайней мере разница в скорости есть)
А у collect какая скорость?
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Roman Samarev
варианты не равнозначны. for и push! - это наполнение массива по одному элементу с его расширением. collect(1:3) - имеет возможность сразу выделить память под массив, а дальше - только копировать. Диапазон выступает в роли итератора. Как выделяет память filter - надо бы проверить….
Тоже не совсем так, вроде какое-то время назад это обсуждалось. При выполнении push! Julia не растягивает массив каждый раз заново, у них там амортизированный push! причём в оба конца.
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
То есть pushfirst! и push! не всегда будут новую память аллоцировать.
По-моему кто-то где-то писал, что у них x2 принцип. То есть выделяется какой-то объём, когда он наполняется, то capacity удваивается.
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
Удвоение - это понятно. Но это все рано делается, если нет возможности выделить линейный массив сразу. Плюс потенциальные копирования при изменении размера
источник

МГ

Михаил Горлатов in Язык программирования Julia / Julia programming language
Андрей Оськин
А у collect какая скорость?
То же самое что и у Vector/Array, в рамках погрешности.
источник

МГ

Михаил Горлатов in Язык программирования Julia / Julia programming language
Получается, они даже по ассемблерному коду равнозначные
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Roman Samarev
Удвоение - это понятно. Но это все рано делается, если нет возможности выделить линейный массив сразу. Плюс потенциальные копирования при изменении размера
x = Vector{Int}()
sizehint!(x, 3)
for i in 1:3
   push!(x, i)
end

😊
источник

АО

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

RS

Roman Samarev in Язык программирования Julia / Julia programming language
Андрей Оськин
x = Vector{Int}()
sizehint!(x, 3)
for i in 1:3
   push!(x, i)
end

😊
x = Vector{Int}(undef, 3). Но тогда можно и push! не писать, а сразу присваивать по индексу. Там могут быть тонкости оптимизации в этом случае. типа SIMD
источник

АО

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

ВФ

Виктор Федоров in Язык программирования Julia / Julia programming language
Roman Samarev
x = Vector{Int}(undef, 3). Но тогда можно и push! не писать, а сразу присваивать по индексу. Там могут быть тонкости оптимизации в этом случае. типа SIMD
size(x)  будет возвращать всегда полный размер
А в случае с push! -  размер будет увеличиваться по мере добавления новых элементов
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
Виктор Федоров
size(x)  будет возвращать всегда полный размер
А в случае с push! -  размер будет увеличиваться по мере добавления новых элементов
Да. Vector{Int}(undef, 3) создаст полный неинициализированный массив. Не уточнил, что это было к тому, что push! всегда хуже, чем копирование в предвыделенный массив. В том числе потому, что цикл вида:
for i in 1:3
 x[i] = i
end


может быть оптимизирован. Автоматически или при помощи макросов-подсказок.
источник

ВФ

Виктор Федоров in Язык программирования Julia / Julia programming language
А вот интересно, почему то
a=1:1000000

b=Array{eltype(a),ndims(s)}(undef,size(a))

На порядок бестрее, чем
b=similar(a)
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Roman Samarev
Да. Vector{Int}(undef, 3) создаст полный неинициализированный массив. Не уточнил, что это было к тому, что push! всегда хуже, чем копирование в предвыделенный массив. В том числе потому, что цикл вида:
for i in 1:3
 x[i] = i
end


может быть оптимизирован. Автоматически или при помощи макросов-подсказок.
Давайте разбираться 😊

https://gist.github.com/Arkoniak/3908f7a4ef6624fbf7688205e2296397

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

Если посмотреть на результаты, то становится понятно следующее.
1. push! и прямой доступ предназначены для решения немного разных задач. Первый для задачи когда размер массива неизвестен, второй - когда известен.
2. При этом, компилятору можно помочь (инициализировать массив или сделать sizehint!), но при этом эти способы помощи нельзя смешивать, то есть нужно делать либо либо.
3. Как и утверждалось, push! не аллоцирует при каждом действии - на 10_000 push! всего лишь 14 аллокаций.
4. Проблема push! вообще не в аллокациях, а видимо в каких-то глубинных внутренних проверках, так как sizehint! по количеству аллокаций и потребляемой памяти превращает push! в прямой доступ, но при этом достаточно мало влияет на производительность.
источник

ВФ

Виктор Федоров in Язык программирования Julia / Julia programming language
Виноват, где-то я ошибся, теперь вроде как одинаково получается
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
подключиться полноценно не могу. n=10000 - маловато. Страница процессора, чаще всего, 4к. Выделение памяти постраничное.

+ http://kristofferc.github.io/post/intrinsics/
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Интереса ради немного доработал gist, построил график как меняется время выполнения. Прыжок в середине - думаю, что это скорее глюк моей машины (сижу в виртуалке, может свои особенности накладывать).
источник

АО

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