SORU
5 Mart 2009, PERŞEMBE


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
5 Mart 2009, PERŞEMBE


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 Objects (ç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 (NodeLists, vb.).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chaoticmoogle

    Chaoticmoogl

    13 ŞUBAT 2006
  • Jeremy Stark

    Jeremy Stark

    23 Mayıs 2010
  • Rugiagialia

    Rugiagialia

    1 Ocak 2008