Size: a a a

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

2020 May 25

АО

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

И первая не аллоцирует, а вторая аллоцирует.
источник

АО

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

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
мм, а если второе записать как:
z2 = ntuple(i -> (x -> x^i), Val{10}())
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
ntuple это моя боль, они мне постоянно нужны, и я в них постоянно лажаю )
источник

АО

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

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
У z что-то вроде var"#498#508"(), var"#499#509"(),
У z2 var"#527#529"{Int64}(1), var"#527#529"{Int64}(2)
источник

АО

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

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
julia> @benchmark $z[5](1)
BenchmarkTools.Trial:
 memory estimate:  0 bytes
 allocs estimate:  0
 --------------
 minimum time:     1.752 ns (0.00% GC)
 median time:      1.964 ns (0.00% GC)
 mean time:        1.962 ns (0.00% GC)
 maximum time:     33.908 ns (0.00% GC)
 --------------
 samples:          10000
 evals/sample:     1000

julia> @benchmark $z2[5](1)
BenchmarkTools.Trial:
 memory estimate:  0 bytes
 allocs estimate:  0
 --------------
 minimum time:     4.213 ns (0.00% GC)
 median time:      5.595 ns (0.00% GC)
 mean time:        5.737 ns (0.00% GC)
 maximum time:     38.442 ns (0.00% GC)
 --------------
 samples:          10000
 evals/sample:     1000
источник

АО

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

АО

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

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
😱😱
источник

A

Alexandr in Язык программирования Julia / Julia programming language
Андрей Оськин
А big разве не вллоцирует? Было что-то недавно на discourse там кто-то тоже обнаружил, что какая-то невинная операция с big внезапно аллоцирует.
Видимо BigInt  алоцирует:

mutable struct BigInt <: Signed
   alloc::Cint
   size::Cint
   d::Ptr{Limb}

   function BigInt(; nbits::Integer=0)
       b = MPZ.init2!(new(), nbits)
       finalizer(cglobal((:__gmpz_clear, :libgmp)), b)
       return b
   end
end
источник

АО

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

A

Alexandr in Язык программирования Julia / Julia programming language
Само наличие Ptr  не означает обязательно аллокации, но в данном случае она видимо происходит
источник

VG

Viktor G. in Язык программирования Julia / Julia programming language
Разве mutable само по себе не означает аллокацию?
источник

A

Alexandr in Язык программирования Julia / Julia programming language
Viktor G.
Разве mutable само по себе не означает аллокацию?
хмм. Видимо действительно означает
источник

A

Alexandr in Язык программирования Julia / Julia programming language
julia> mutable struct aa
      i::Int
      end

julia> @time(aa(10))
 0.000000 seconds (1 allocation: 16 bytes)
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
а вот если я к примеру пишу struct, а сам полем делаю массив
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
да, тогда зависит от аргумента, с которым вызываю, получается что так
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
struct Baz{T}
      fld :: T
      end

julia> @benchmark Baz($[1,2,3])
BenchmarkTools.Trial:
 memory estimate:  16 bytes
 allocs estimate:  1
 --------------
 minimum time:     5.007 ns (0.00% GC)
 median time:      9.500 ns (0.00% GC)
 mean time:        11.555 ns (15.78% GC)
 maximum time:     18.248 μs (99.95% GC)
 --------------
 samples:          10000
 evals/sample:     1000

julia> @benchmark Baz($(1,2,3))
BenchmarkTools.Trial:
 memory estimate:  0 bytes
 allocs estimate:  0
 --------------
 minimum time:     0.029 ns (0.00% GC)
 median time:      0.032 ns (0.00% GC)
 mean time:        0.032 ns (0.00% GC)
 maximum time:     0.054 ns (0.00% GC)
 --------------
 samples:          10000
 evals/sample:     1000
источник