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[]
: 299msusing new
: 363ms
14 ** sayesinde bu kod benchmark ve bir değişken tanımlamak için daha olası bir yol.
CEVAP
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.
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 /[]/)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...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.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)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.
Neden sıralanmamış bir dizi daha hızlı...
Neden dizidir.bazen daha hızlı dizi[n]...
Neden Python kodunu daha hızlı bir işl...
Neden [] liste daha hızlı()?...
Neden't varsa PyPy 6.3 kat daha h...