Size: a a a

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

2019 August 04

ZZ

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

GI

Gleb Ivashkevich in Язык программирования Julia / Julia programming language
ну да, выхлоп из code_native не шибко читаемый
источник

GI

Gleb Ivashkevich in Язык программирования Julia / Julia programming language
у меня не получается там x->x+1234+t*5678 найти(
источник

ZZ

Zorro Zorroff in Язык программирования Julia / Julia programming language
дык я ж о чем
источник
2019 August 08

ZZ

Zorro Zorroff in Язык программирования Julia / Julia programming language
Тревога! Волк унес зайчат! У меня простой массив строк (миллионы). Я прохожу по нему в простом цикле, в поисках конкретных строк. И у меня куча аллоков как результат!

function f()
   tq :: Array{String} = ...
   lim :: Int = ...
   a :: Int = 0
   for zz in 1:lim
            if tq[zz] == "x"  # <- allocation is here
               a += 1234 + zz
            end
   end
end    

Оказывается, сравнение строк вызывает аллок, потому что внутре берется указатель на строку (используя jl_value_ptr), потом вызывается memcmp. Пишут, что jl_value_ptr аллоцирует копию, и выходит не врут.
источник

ZZ

Zorro Zorroff in Язык программирования Julia / Julia programming language
А именно:

%52  = $(Expr(:foreigncall, :(:jl_value_ptr), Ptr{Nothing}, svec(Any), :(:ccall), 1, :(%33)))::Ptr{Nothing}
│    %53  = (Core.bitcast)(Core.UInt, %52)::UInt64
│    %54  = (Base.add_ptr)(%53, 0x0000000000000008)::UInt64
│    %55  = (Core.bitcast)(Ptr{Nothing}, %54)::Ptr{Nothing}
│    %56  = (Base.bitcast)(Ptr{UInt8}, %55)::Ptr{UInt8}
│    %57  = $(Expr(:foreigncall, :(:jl_value_ptr), Ptr{Nothing}, svec(Any), :(:ccall), 1, "B"))::Ptr{Nothing}
│    %58  = (Core.bitcast)(Core.UInt, %57)::UInt64
│    %59  = (Base.add_ptr)(%58, 0x0000000000000008)::UInt64
│    %60  = (Core.bitcast)(Ptr{Nothing}, %59)::Ptr{Nothing}
│    %61  = (Base.bitcast)(Ptr{UInt8}, %60)::Ptr{UInt8}
│    %62  = $(Expr(:foreigncall, :(:memcmp), Int32, svec(Ptr{UInt8}, Ptr{UInt8}, UInt64), :(:ccall), 3, :(%56), :(%61), :(%47), :(%47), "B", :(%33)))::Int32
│    %63  = (Core.sext_int)(Core.Int64, %62)::Int64
источник

ZZ

Zorro Zorroff in Язык программирования Julia / Julia programming language
Изолированный случай:

function test() a=Array{String}(undef, 10000); a .= "hi"; @benchmark for i in 1:length(a) if a[i]=="qq" end end end; test()
источник

ZZ

Zorro Zorroff in Язык программирования Julia / Julia programming language
ЧЯДНТ?
источник

ZZ

Zorro Zorroff in Язык программирования Julia / Julia programming language
Нашел: обращение к глобальным переменным
источник

ZZ

Zorro Zorroff in Язык программирования Julia / Julia programming language
(совпало)
источник

AL

Anatoly Levenchuk in Язык программирования Julia / Julia programming language
Надо обращение к глобальным переменным жирным шрифтом в редакторе подчёркивать. И ещё чтобы мигало.
источник

ZZ

Zorro Zorroff in Язык программирования Julia / Julia programming language
а вот нет, не глобальные переменные вовсе.
источник

ZZ

Zorro Zorroff in Язык программирования Julia / Julia programming language
я щас дальше смотрю.
источник

ZZ

Zorro Zorroff in Язык программирования Julia / Julia programming language
function wtf()
   case = 1
   if case == 0
       a0 = CSV.read(string(ENV["HOME"], "/tmp/g.csv"))
       arr :: Array{String}= collect(a0.bs);
   else
       arr = Array{String}(undef, 10000)
       arr .= "h";
   end
   lim :: Int = length(arr)
   m = 0
   @time for zz in 1:lim
            if arr[zz] == "B"
               m += 1234 + zz
            end

         end    
end
источник

ZZ

Zorro Zorroff in Язык программирования Julia / Julia programming language
вот целиком случай. Оказывается, массив массиву рознь, и collect не может сделать ТАКОЙ же массив как и обычный Array{}(undef, SIZE)
источник

ZZ

Zorro Zorroff in Язык программирования Julia / Julia programming language
в зависимости от case тут либо есть аллокации в @time либо нет
источник

KT

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

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
Вы попробуйте вне тестовой функции ее звполнить
источник

ZZ

Zorro Zorroff in Язык программирования Julia / Julia programming language
а в чем отличие будет? заметим, тайм тут репортит только цыкл со сравнениями
источник

ZZ

Zorro Zorroff in Язык программирования Julia / Julia programming language
я сделал, и действительно, разница есть. Теперь я вообще не понимаю.
источник