Neden dizidir.bazen daha hızlı dizi[n] den = değer itmek?
Bazı kod test bir yan sonuç olarak dizi kullanarak hızını karşılaştırmak için küçük bir fonksiyon yazdım.yöntem vs doğrudan adresleme dizi = değer () itin. Benim için sürpriz itme yöntemi özellikle Firefox daha hızlı olmak ve bazen Chrome gösterdi. Sadece meraktan soruyorum: bunun için bir açıklama var mı? Test 12* *@bulabilirsiniz ('Dizi karşılaştırma yöntemleri') . click
CEVAP
Faktörler türlü devreye girer, en JS uygulamaları gerekirse daha sonra ortaya çıkarsa depolama seyrek dönüştürür düz bir dizi kullanın.
Temelde seyrek olmaya karar sezgisel öğeleri ayarlayın ve ne kadar düz kalması için harcanan dayanmaktadır.
Senin durumunda JS motoru n
uzunluğunda ama sadece tek bir unsur olması gereken bir dizi göreceksiniz anlamına gelir, son öğe ilk ayar. n
Bu hemen dizinin seyrek bir dizi en motorlarda -- yapacak yeterince büyük değilse, bu tüm sonraki eklemeler yavaş seyrek dizi davayı kabul anlamına gelir.
Hangi dizin için dizin 0'dan dizinin n-1 -- çok, çok daha hızlı olmalıdır dolgu ek bir test eklemek gerekir.
Yanıt @Christoph ve bir arzu ertelemek, burada bir açıklama nasıl diziler (genellikle) uygulanan JS -- özelliklerini değişir gelen JS motoru JS motoru ama genel prensip aynı.
Tüm JS Object
s (çok değil dizeleri, sayılar, doğru, yanlış, undefined
null
) miras tabanından nesne türü-Tam uygulanması değişir, olabilir C devralma veya el ile C (iyi yapıyor bunu zaten) -- temel Nesne türünü tanımlar varsayılan özellik erişim yöntemleri, örn.
interface Object {
put(propertyName, value)
get(propertyName)
private:
map properties; // a map (tree, hash table, whatever) from propertyName to value
}
Bu Nesne türü özelliği erişim mantığı, prototip zinciri, vb tüm standart işler. Dizi uygulama olur o zaman
interface Array : Object {
override put(propertyName, value)
override get(propertyName)
private:
map sparseStorage; // a map between integer indices and values
value[] flatStorage; // basically a native array of values with a 1:1
// correspondance between JS index and storage index
value length; // The `length` of the js array
}
Şimdi JS içinde bir Dizi oluşturduğunuzda motoru bir şey yukarıdaki veri yapısı benzer oluşturur. Eklediğinizde bir nesneye bu Dizi örnek bir Dizi metot çekleri görmek için özellik adı bir tamsayı (ya da dönüştürülebilir bir tamsayı, örneğin "121", "2341", vb.) 0 ve 2^32-1 (ya da muhtemelen 2^31-1, ben tam hatırlamıyorum) arasında. Eğer değilse, o zaman bu yöntem temel Nesne uygulaması ve standart iletilir [[Koyun]] mantık yapılır. Aksi takdirde değerdir içine yerleştirilmiş bir Dizi kendi depolama, veriler yeterince kompakt sonra motoru kullanır düz dizi depolama, bu durumda ekleme (ve alma) sadece standart bir dizi dizin oluşturma işlemi, aksi takdirde motoru dönüştürmek için dizi seyrek depolama ve put/get kullanmak için bir harita almak propertyName değer yer.
Dürüst olmak gerekirse, eğer herhangi bir JS motoru bu dönüşüm gerçekleştikten sonra şu anda düz depolama için seyrek olarak da kullanabilirsiniz emin değilim.
Her neyse, o olur ve daha iğrenç ayrıntıları bir dizi bırakır ne oldukça yüksek düzeyde bir bakış, ama genel uygulama desen. Ek koymak/almak nasıl depolama ve sevk nasıl özellikleri motor -- farklı ama bu gerçekten tasarım/uygulama tarif edebilirim çok açık.
Reşit ayrıca işaret ederken ES spec ifade eder propertyName
olarak bir dize JS motorları eğilimi uzmanım üzerinde tamsayı aramaları olarak o kadar someObject[someInteger]
olmaz dönüştürme tamsayı bir dize bakıyorsun bir nesne olan tamsayı özellikleri (örn. Dizi, String, ve DOM türleri (NodeList
s, vb.).
Neden sıralanmamış bir dizi daha hızlı...
Arr = neden [] daha hızlı = yeni Dizi?...
Neden Python kodunu daha hızlı bir işl...
Neden [] liste daha hızlı()?...
Neden't varsa PyPy 6.3 kat daha h...