Neden ifadeleri benim fonksiyonlarını yavaşlatır unexecuted?
Dört farklı fonksiyonları, bu şekilde oluşturduk:
var normal = function() {
return;
};
var control = function() {
return;
alert("Hello, world!");
};
var withArguments = function() {
return;
arguments;
};
var withEval = function() {
return;
eval("");
};
Hepsi sadece bir şey yapmak ve hemen döndüğünden beri hepsi aynı hızda olması beklenir. Ama, testing it on jsPerf, sonra normal
control
yaklaşık aynı idam buluyorum, ama withArguments
withEval
çok daha yavaş yürütün.
Neden bu unexecuted ifadeleri herhangi bir performans etkisi olur? Asla idam oldukları için, onları nasıl herhangi bir etkisi olması mümkün mü?
CEVAP
Kısacası, eval
fonksiyon ve hem de ekstra kullanım arguments
dizi erişmek için güçlü olmak içinde arama ayarlama fonksiyonu çağırma sırasında. Eğer arguments
ne eval
ne yapılacak ise, bu ekstra set-up atlanır olabilir.
Derleyici değildir girişimi tahmin olsun ya da olmasın arguments
dizi gerçekten erişilebilir olup olmadığını veya eval
aslında denebilecek sadece Çek ya da değil, onlar mevcut olan işlevi.
arguments
Bir daha çalışma zamanı sırasında arguments
nesne kullanan variadic bir işlevi çağırmak için daha pahalı "normal" arguments
object değil işlevi.
Ekstra adımları arguments
nesne bildirildi yürütme ortamı bağlamak için gerekli specified in §10.6 of the ECMA-262 standard. arguments
nesne oluşturma biraz pahalı 15 adımlı bir işlemdir. Temelde, arguments
-geçti argümanlarla doldurulması ve .caller
.callee
özellikler oluşturulacak.
Standart arguments
nesne bir fonksiyon bir parametre, değişken veya işlev işlevi arguments
adlı çağırılacaktır olmadıkça yürütme içeriği geçer, ne zaman oluşturulmuş olması gerektiğini söylüyor.
İyileştirme amaçlı, çoğu tarayıcı aslında işlevi aslında bir yerlerde (hatta return
sonra) kullandığı sürece değişkenleri nesne oluşturun. Bu bir performans arguments
çizgiler içeren hiç yürütülür bile başvurulan, zaman vurmak görmek nedeni budur.
eval
eval
kodu specified in §10.4.2 of the ECMA-262 standard olarak girerken özel bir yürütme içeriği oluşturmak gerekir. Temelde, eval
içeriğe arama işlevi yürütme bağlamında tüm özelliklerini bağlamak için vardır.
Eğer eval
nın bir fonksiyonu olarak adlandırılan birden fazla ise, temelde her ikisi de iki kez aynı işlemi onlar yapıyor olacak. Optimizasyon için, eğer tarayıcılar algılayan vardır eval
işlevi (bir return
), önceden doldurur bu yeni yürütme içeriği her eval
olabilir, böylece yok olmaya yeniden birden çok kez.
Bu iyileştirmeler tarayıcı bağımlı ve standart tarafından gerekli değildir unutmayınbazı tarayıcılar aslında iyileştirmeleri açıklanan gerçekleştirmek olabilir , ya da farklı şeyler yapabilirler.
Neden 0 0,1 f değişen 10x performansın...
Neden benim program tam olarak 8192 el...
Neden stil iOS7 içinde UİTableViewStyl...
Neden't logcat benim Android bir ...
Neden'benim top (nesneler) t/kayb...