SORU
12 EYLÜL 2012, ÇARŞAMBA


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
12 EYLÜL 2012, ÇARŞAMBA


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 evalnı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.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EmperorTigerstar

    EmperorTiger

    14 EYLÜL 2009
  • FrankJavCee

    FrankJavCee

    29 Kasım 2008
  • Alexey - servant of Christ

    Alexey - ser

    15 EYLÜL 2007