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
İ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;
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() { };
İş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
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.
Neden GCC neredeyse aynı C kodu için t...
Rsync kullanırken farklı bir ssh port ...
Nasıl bir Java HashMap aynı karma kodu...
Nasıl C aynı sınıf için farklı türleri...
Eğer iki farklı listeler tam olarak ay...