2017-01-23 23 views
5

removeLast. documentation, O (1) diyor ve ben uygulamanın basitçe dizi boyutunu azaltacağını düşünürdüm. Anlaşılan değil:hızlı dizi <code>removeLast</code> (bu 77k elemanları patlak için birkaç dakika sürer) son derece yavaş çağrı son derece yavaş

stack trace indicating <code>removeLast</code> calling memmove

Neden çağırıyor remove(at: Int)?

daha beklersiniz Bu üreme durum yavaş (ı alışığım C++ 'ın std::vector performans), ama benim kodunda görüyorum ne kadar hala yavaş değil:

var array = [ Int ]() 

for i in 0..<262144 { 
    array.append(i) 
} 

print ("done appending") // we get here immediately 

let n = array.count 
for _ in 0..<n { 
    array.removeLast() // popLast is also slow 
} 

print ("done") 

Bu 16 saniye sürer benim makinemde. Eşdeğer bir C++ programı .002 saniye sürüyor.

+2

Bunu test nasıl kod gönderebilir miyim? – Fogmeister

+0

Diziler, yazma üzerine yazılan değer türleridir. Bu yüzden, 'removeLast' üzerinde yeni bir kopya oluşturması mantıklı. Ancak, bunun da hızlı olması gerektiğini düşünürdüm. –

+0

@Fogmeister Tüm kodumu boşaltmadan bir repro için kod çıkarmaya çalışıyorum. Benzer bir test vakası yazdığımda hızlıdır. İnce bir şey oluyor. – Taylor

cevap

4

sorun test ettiğiniz yoludur. Hız testi, bir Hata Ayıklama yapısında en ufak anlamlıdır. Bu neden gerektiğini daima profil yılında Aletleri olduğunu. Sürüm oluşturma kullanır. Gerçekçi sonuçlar için cihazdaki Cihazlarda profil. Diğer her şey bir yanılsamadır.

Yani Yayın yapı değil, bir ayıklama inşa yapın. Sen gerçekte hem print ifadeleri anında almak göreceksiniz. (Bilgisayarım, bir cihaz üzerinde, benim cebinden telefonunu almaya tembel olduğu için)

Sonuçları referans tarihinden itibaren saniye görüntülendiği:

starting 506917910.056674 
done appending 506917910.060245 
done 506917910.069827 
+0

teyit edebilir: 'anında – Alexander

+0

aptalım tamamlanan hızlı -O test.swift'. Hata ayıklama yapıları kullanıyorum! – Taylor

+0

Aynı şey bellek yönetimi için de geçerlidir. Simülatördeki bir Debug yapısındaki hızlı bellek yönetimi büyük bir yalandır. – matt