SORU
28 Ocak 2015, ÇARŞAMBA


yavaş işlevi farklı nesneleri işlevleri için aynı anahtarı kullanırken V8 arayın

Çağrı yavaş olduğu için belki değil, ama daha ziyade arama; emin değilim, ama burada bir örnek:

var foo = {};
foo.fn = function() {};

var bar = {};
bar.fn = function() {};

console.time('t');

for (var i = 0; i < 100000000; i  ) {
    foo.fn();
}

console.timeEnd('t');

Windows 8 üzerinde test edilmiştir.1

  • firefox 35.01:~240ms
  • krom 40.0.2214.93 (V8 3.30.33.15):~760ms
  • msıe 11:34 sn
  • nodejs 0.10.21 (V8 3.14.5.9):~100 MS civarında
  • iojs 1.0.4 (V8 4.1.0.12):~760ms

Şimdi burada eğer bar.fn 7 ** değiştirirsem ilginç kısmı:

  • krom 40.0.2214.93 (V8 3.30.33.15):~100 MS civarında
  • nodejs 0.10.21 (V8 3.14.5.9):~100 MS civarında
  • iojs 1.0.4 (V8 4.1.0.12):~100 MS civarında

Yanlış bir şey v8 son zamanlarda gitti? Bu ne neden olur?

CEVAP
28 Ocak 2015, ÇARŞAMBA


İlk temelleri.

V8 kullanırdersler gizliile bağlıgeçişlerkabarık şekilsiz statik yapısını keşfetmek için nesneleri JavaScript.

Gizli nesne sınıflarını yapısı, gizli sınıfları birlikte eğer belirli bir eylem bir nesne üzerinde gerçekleştirilen kullanılması gerektiğini anlatan link geçişleri açıklar.

Örneğin kodu aşağıda gizli sınıfların aşağıdaki zincir neden olur:

var o1 = {};
o1.x = 0;
o1.y = 1;
var o2 = {};
o2.x = 0;
o2.y = 0;

enter image description here

Bu zincir o1 yapı olarak oluşturulur. o2 yapılınca V8 sadece kurulan geçişleri izler.

Şimdi ne zaman bir özellik fn kullanılan saklamak için bir işlev V8 çalışır bu özellik bir özel tedavi: yerine sadece ilan içinde gizli sınıf nesnesini içeren bir özellik fn V8koyar gizli sınıf içine fonksiyon.

var o = {};
o.fn = function fff() { };

enter image description here

İşte ilginç bir sonucu da burada: eğer sen mağaza farklı işlevleri içine alan ile aynı adı V8 artık sadece takip geçişler nedeniyle değer fonksiyonu özelliği eşleşmiyor beklenen değer:

var o1 = {};
o1.fn = function fff() { };
var o2 = {};
o2.fn = function ggg() { };

Zaman değerlendirme o2.fn = ... atama V8 göreceksiniz bu bir geçiş etiketli fn ama neden bir gizli sınıf değil uygun: içerir fff fn özellik iken çalışıyor deposu ggg. Not: basitlik - V8 içten isimlerini ama kendi kullanmaz sadece fonksiyon isimlerini verdimkimlik.

V8 takip edemiyoruz çünkü bu geçiş V8 gizli sınıf için işlevi teşvik kararını yanlış ve gereksiz olduğuna karar verecek. Resim değişecek

enter image description here

V8 fn sadece basit bir özellik olduğu yeni bir gizli sınıf ve sürekli bir işlev özelliği artık değil yaratacaktır. Geçiş yönlendir ve aynı zamanda eski geçiş hedef işareti olacaktırkaldırılmış. o1 hala kullanmayı unutmayın. Ancak bir dahaki sefere kodu dokunur bir özelliği ondan yüklendiğinde 22* örneğin * - zamanı kaldırılmış gizli sınıf o1 göç edecek. Bu polimorfizmi azaltmak için yapılır. - o1 o2 farklı sınıflar gizli olmasını istemiyoruz.

Neden gizli sınıfları fonksiyonları için önemli mi? Bu V8 optimize derleyici bilgi verdiği için kullanırsatır içi yöntemi çağırır. Sadece Ara hedef gizli sınıfın kendisi üzerinde saklanıyorsa yöntem çağrısı satır içi olabilir.

Şimdi yukarıdaki örnekte, bu bilgiyi sağlar.

Çünkü orada bir çatışma arasında geçişler bar.fn foo.fn olmak normal özellikleri ile işlevleri saklı doğrudan bu nesneleri ve V8 olamaz satır içi arama foo.fn lider için daha yavaş bir performans.

Çağrı önce satır içi olabilir mi?Evet. Değişti: işte eski V8itiraz mekanizması yokfn normal bir özelliği haline geldiği bir çatışma vardı ve geçiş gizli sınıf geçirilmemiş fn yönlendirilmiş sonra bile. foo fn sabit fonksiyonu bir özelliği doğrudan gizli sınıf satır için en iyi duruma getirme derleyici izin içine gömülü olduğu gizli tutulan sınıfı yerine.

Eski düğümde bar.fn zamanlama çalışırsanız daha yavaş olduğunu göreceksiniz:

for (var i = 0; i < 100000000; i  ) {
    bar.fn();  // can't inline here
}       

en iyi duruma getirme derleyici bar.fn çağrı içi izin vermeyen gizli sınıf kullandığı için tam olarak.

Şimdi son bir şey daha fark işte bu kriter değildir ölçü performans bir işlev çağrısı, daha ziyade ölçer en iyi duruma getirme derleyici azaltabilir bu döngü için boş bir döngü ile satır içi uygulaması çağrısı içinde.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrew_Huang

    Andrew_Huang

    10 ŞUBAT 2006
  • Kontor.TV

    Kontor.TV

    14 Mart 2006
  • ShayLoss

    ShayLoss

    5 Kasım 2009