SORU
10 EYLÜL 2011, CUMARTESİ


Arr = neden [] daha hızlı = yeni Dizi?daha arr

Bu kodu araştırdım ve aşağıdaki sonucu aldım. Ben [] daha hızlı olduğunu neden merak ediyorum?

console.time('using[]')
for(var i=0; i<200000; i  ){var arr = []};
console.timeEnd('using[]')

console.time('using new')
for(var i=0; i<200000; i  ){var arr = new Array};
console.timeEnd('using new')
  • using[]: 299ms
  • using new: 363ms

14 ** sayesinde bu kod benchmark ve bir değişken tanımlamak için daha olası bir yol.

enter image description here

CEVAP
10 EYLÜL 2011, CUMARTESİ


Daha önceki cevaplara genişleyen...

Derleyiciler genel bir bakış açısıyla ve VM özel iyileştirmeleri: göz ardı ederek

İlk olarak, kod biz tokenize nerede sözcüksel analiz aşaması ile başlıyoruz.

Örnek olarak, aşağıdaki göstergeleri ortaya çıkabilir:

[]: ARRAY_INIT
[1]: ARRAY_INIT (NUMBER)
[1, foo]: ARRAY_INIT (NUMBER, IDENTIFIER)
new Array: NEW, IDENTIFIER
new Array(): NEW, IDENTIFIER, CALL
new Array(5): NEW, IDENTIFIER, CALL (NUMBER)
new Array(5,4): NEW, IDENTIFIER, CALL (NUMBER, NUMBER)
new Array(5, foo): NEW, IDENTIFIER, CALL (NUMBER, IDENTIFIER)

Umarım bu seni ne kadar çok (veya daha az) işlem gerekli olduğunu anlamanız için yeterli bir görselleştirme sağlamak gerekir.

  1. Yukarıdaki simgeleri dayalı, aslında bir ARRAY_İNİT her zaman bir dizi üretecek biliyoruz. Biz bu nedenle sadece bir dizi oluşturun ve doldurun. Bildiğim kadarıyla belirsizlik, sözcüksel analiz aşaması vardır zaten seçkin ARRAY_İNİT bir nesne özelliğinin erişimci (örneğin obj[foo]) ya da parantez içinde dizeleri/düzenli rakamları (örneğin, "foo[]bar" ya da /[]/)

  2. Bu minik, ama biz de new Array jetonun var. Ayrıca, tamamen temiz sadece bir dizi oluşturmak isteyen olmadı. Biz "" token, ama "" ne? yeni yeni Biz o zaman TANIMLAYICI bir yeni "," ama JavaScript VM genellikle bir TANIMLAYICI belirteç ayırt edemez ve "yerel genel nesneler." belirteçleri Dizisi istediğimiz token bakın Bu nedenle...

  3. Biz bir TANIMLAYICI belirteç karşılaşma kapsam zincirinin her zaman aramak zorunda kalıyoruz. Javascript VMs ""argümanlar" nesnesi, yerel olarak tanımlanan değişken, vb. içerebilir" her yürütme içeriği için Etkinleştirme nesnesi içerir Eğer Aktivasyon nesneyi bulamadık, küresel kapsamı ulaşana kadar kapsam zinciri bakarak başlıyoruz. Eğer bir şey bulunursa, ReferenceError bir atıyoruz.

  4. Değişken bildirimi tespit ettik bir kez, biz kurucusunu çağırmak. new Array örtülü bir işlev çağrısı, ve başparmak kuralı işlevi aramaları sırasında daha yavaş yürütme (neden bu kadar durağan C/C derleyicileri izin ver "işlevi satır içi uygulaması" - hangi JS JİT motorları gibi SpiderMonkey yapmak zorunda on-the-fly)

  5. Array kurucu aşırı yüklendi. Dizi yapıcı bazı performans geliştirmeleri sağlar böylece yerel kod olarak kullanılır, ama yine de bağımsız değişken uzunluğu ve buna göre hareket için onay gerekiyor. Ayrıca, tek bir argüman olması durumunda, daha fazla bağımsız değişkenin türü kontrol etmeliyiz. ("") foo üretir. [""] foo yeni Dizi(1) üretir [tanımsız] . yeni Dizi

Dizi rakamları, VM bir dizi istiyoruz bilir; new Array ile VM ekstra CPU döngülerini 13* *ne olduğunu anlamak için kullanmak gerekiyor . her basitleştirmek için: ^em>aslındayok.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Google Chrome

    Google Chrom

    1 EYLÜL 2008
  • We've moved!

    We've moved!

    7 Ocak 2008
  • Microsoft Research

    Microsoft Re

    24 EKİM 2008