aşağıdaki işlevi göz önünde bulundurun:Gereksiz tahsisler
x = rand(30,30,100000)
b = rand(100000)
@time mytest(x,b)
elapsed time: 0.571765222 seconds (727837732 bytes allocated, 66.49% gc time)
neden bu kadar fazla bellek ve harcama çok fazla zaman ayırdığından: Onu çalıştırdığınızda
function mytest(x, b)
y = zeros(x[:,:,1])
for i in 1:length(b)
y += b[i] * x[:,:,i]
end
return y
end
, aşağıdaki alıyorum çöp toplama yapıyor? Kod, kararlı olmalı ve +=
operatörünün yeniden ayırma gerçekleştirmemesini beklerdim. Ancak, her zaman iki matris eklediğinde yeniden tahsis ediyor gibi görünüyor.
Julia'da bir hata olduğunu düşünmeli miyim? Ve daha önemlisi, bu kodu yeniden tahsis etmeyecek şekilde nasıl yazabilirim?
DÜZENLEME: düzeltildi.
Sağ taraf 'b [i] * x [:,:, i]', önce ürünün sol tarafına eklenmeden önce ürünün sonucu ile geçici bir dizi ayırır. Geçici dizinin daha sonra çöp toplanması gerekiyor. En azından ... işte bu yüzden [tag: numpy] ile çalışır. –
@moarningsun, bahşiş için teşekkürler. Performansa ilişkin kritik kodla ilgili önceki deneyimim çoğunlukla bir dilim alırken geçici olarak ayrılmayacak olan C++ ve Eigen kullanıyor. Kodumu döngüler için üç yuvaya sahip olacak şekilde değiştirdim ve ayırma sorunu giderildi. (Bundan önce ArrayViews paketini kullanmayı denedim, ancak bu, işleri düzeltmek için görünmüyordu.) Daha iyi bir yol varsa merak ediyorum. –
@JimGarrison: tartışmaya bakın [burada] (https://groups.google.com/forum/#!topic/julia-users/i5hfGpWRHlk). '+ =' sadece sözdizimsel şekerdir (şimdilik en azından) ve bu yüzden her zaman yeniden tahsis eder (ama birileri yanılıyorsa lütfen beni düzeltin). Ayrıca, üç döngünün probleminizi nasıl çözdüğünü görmek isterim. – cd98