SORU
22 NİSAN 2011, Cuma


Bir dizi `length` özelliği okuma gerçekten pahalı JavaScript bir operasyon?

Ben her zaman JavaScript bir dizi uzunluğu önbellekleme iyi bir fikir (for bir döngü durumu, özellikle bir dizi uzunluğu hesaplama pahalılık nedeniyle kabul edilir.

Örnek

for (var i = 0; i < arr.length; i  ) { }

// vs

for (var i = 0, arrLength = arr.length; i < arrLength; i  ) { }

Ancak, length belki de bu özellik dizinin oluşturulması ve değiştirilmesi güncellenir sadece düşündüm. Bu nedenle, okuma vermemeli çok pahalı bir işlem karşıt olarak okuma saklanan bir değişken (karşıt olarak diğer yöntemler, diğer diller gerekebilir etmeye bellek bulmak için son bir şey, örneğin strlen() C).

İki sorum var. Ayrıca bu işlerin nasıl yürüdüğünü merak ediyorum, lütfen bana vurmaprematüre optimizasyonusopa.

Tarayıcılarda JavaScript motorları varsayalım.

  1. JavaScript bir dizi length özellik önbelleğe alma için herhangi bir avantajı var mı? Çok nesne özelliğini üzerinde yerel bir değişken okumak daha yer var mı?
  2. length Bu özellik sadece yeni bir dizi dönüş yok shift() pop() türü yöntemleri oluşturma ve değişmiş ve aksi takdirde sadece bir tamsayı olarak saklanır?

CEVAP
22 NİSAN 2011, Cuma


Evet, deseydim oldu pahalı, ama daha sonra yazdığım küçük bir test @ jsperf.com ve benim için sürpriz kullanarak i<array.length aslında daha hızlı Chrome ve FF(4). hiç fark etmezdi.

Benim şüphe uzunluğu tamsayı (Uınt32) olarak saklanır. ECMA-gözlük (262 ed. 5, sayfa 121):

Her Dizi bir nesne var her zaman sıfırdan büyük olan uzunluk özelliği az 2 tamsayı32. Length özelliğinin değeri sayısal olarak adını daha büyük bir dizi olan her özellik indeks; ne zaman bir Dizinin bir özelliği nesne oluşturulan ya da değiştirilen, başka bir şey değildir özellikleri gerektiği gibi ayarlanır bu değişmeyen korumak için. Özellikle, bir özelliği ne zaman kimin adı eklenen bir dizi dizini, uzunluk özelliği varsa değiştirilir gerekli, birden fazla olmak bu dizinin sayısal değer Endeksi; length özelliği her değişti, her özellik adı kimin değer bir dizi dizini değil yeni uzunluğundan daha küçüktür otomatik olarak silinir. Bu kısıtlama tek bir özellikleri kendi için geçerlidir Dizi nesne ve etkilenmez uzunluğu veya dizi dizini özellikleri onun prototip miras olabilir

Vay! Eğer ben böyle bir dili alışmak mı bilmiyorum ...

Son olarak, her zaman tarayıcı arkasında iyi bizim eski kalmış. YANİ (9, 8, 7) uzunluğu önbellekleme çok daha hızlıdır. Daha birçok nedenlerinden biri, YANİ kullanmak için değil, diyorum.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • chickenby

    chickenby

    2 HAZİRAN 2008
  • RyanXLT

    RyanXLT

    22 Ocak 2011
  • TotalSeminarsChannel

    TotalSeminar

    16 Mart 2010