SORU
29 Temmuz 2015, ÇARŞAMBA


Bu işlev, çok yavaş çalışıyor ne yapar?

Bir deney eğer fonksiyonlar yerel değişkenler bir yığın üzerinde depolanır olmadığını görmek için çalışıyorum.

Küçük bir performans testi yazdım

function test(fn, times){
    var i = times;
    var t = Date.now()
    while(i--){
        fn()
    }
    return Date.now() - t;
} 
ene
function straight(){
    var a = 1
    var b = 2
    var c = 3
    var d = 4
    var e = 5
    a = a * 5
    b = Math.pow(b, 10)
    c = Math.pow(c, 11)
    d = Math.pow(d, 12)
    e = Math.pow(e, 25)
}
function inversed(){
    var a = 1
    var b = 2
    var c = 3
    var d = 4
    var e = 5
    e = Math.pow(e, 25)
    d = Math.pow(d, 12)
    c = Math.pow(c, 11)
    b = Math.pow(b, 10)
    a = a * 5
}

İnversed iş çok daha hızlı almak için bekliyordum. İnanılmaz bir sonuç çıktı onun yerine.

Kadar 10 kat daha hızlı ikinci bir test olarak gidiyor fonksiyonları test ediyorum.

Örnek:

> test(straight, 10000000)
30
> test(straight, 10000000)
32
> test(inversed, 10000000)
390
> test(straight, 10000000)
392
> test(inversed, 10000000)
390

Alternatif denendi aynı davranış.

> test(inversed, 10000000)
25
> test(straight, 10000000)
392
> test(inversed, 10000000)
394

Ve kesinlikle hiçbir ipucu var neden olurdu Node.js Chrome tarayıcıda hem de test ettik. Etkisi ben Geçerli sayfayı yenile ya da Düğüm yeniden ÇOĞALTMA kadar sürer.

Böyle önemli (~12 kat daha kötü) performans kaynağı ne olabilir?

PS. Bazı environemnts sadece iş gibi görünüyor beri lütfen bunu test etmek için kullandığın ortama yazma.

Benim vardı:

İşletim sistemi: Ubuntu 14.04
Düğüm v0.10.37
Krom 43.0.2357.134 (Resmi Yapı) (64-bit)

/Düzenle
Firefox 39 emri her ne olursa olsun test için ~5500 ms sürer. Belirli motorlar sadece üzerinde gerçekleşmesi gibi görünüyor.

/Edit2
Test işlevi işlevi satır içi uygulaması her zaman aynı anda çalışmasını sağlar.
Eğer her zaman aynı işlevi, eğer işlevi, parametre inlines bir iyileştirme var olması mümkün mü?

CEVAP
29 Temmuz 2015, ÇARŞAMBA


İki farklı fonksiyonu ile test aramadan sonra megamorphic ve V8 olur fn() callsite içinde satır içi değiştiremiyor.

V8 işlev çağrıları yöntem çağrıları o.m(...) (karşıt olarak) eşlik ettibir öğegerçek polimorfik içi bir önbellek yerine satır içi önbellek.

V8 fn() callsite de satır yazamadığı kodunuzu en iyi duruma getirme çeşitli uygulamak için yapamaz. Eğer sen de kodu IRHydra (yükledim derleme eserler için özü için rahatlığı) göreceksiniz ilk iyileştirilmiş sürümü test (zaman özel fn = straight) tamamen boş ana döngü.

enter image description here

V8 sadece inlined straightkaldırıldısenin Ölü Kod ile karşılaştırma için umut Eliminasyon tüm kod optimizasyonu. V8 yerine dinamik kontrastlı V8 eski bir sürüm sadece kod tamamen döngü değişmez çünkü kodu LİCM üzerinden döngünün dışında vinç - olur.

straight V8 bu iyileştirmeleri uygulayamazsınız inlined değil - bu yüzden performans farkı. Yeni sürüm hala geçerli olacak straight inversed boş fonksiyonları içine kendilerini dönüm OLAMAZ

enter image description here

performans farkı o kadar büyük (2-3x) değil. Eski V8 değildi yeterince saldırgan ile dinamik kontrastlı ve bu apaçık büyük bir fark arasında inlined değil-inlined durumlarda, çünkü yüksek performans inlined böyleydi sadece sonucu agresif döngü değişmeyen kodu hareket (LİCM).

İlgili not Bu kriterler asla onların sonuçları boş bir döngü ölçüm son olarak bi faydası olmayan bu gibi yazılmalıdır neden gösterir.

Polimorfizmi ilgilenen ve V8 sonuçları yazıma "What's up with monomorphism" kontrol (bölüm "tüm önbelleğe aynı" önbelleğe işlevi ile ilgili görüşmeler çağırır). Ben de sana ortak tuzaklardan kaçınmak için yardımcı olabilir, örneğin GOTO Chicago 2015 (video) *en son 20 konuşma - microbenchmarking tehlikeleri hakkında konuşmalarımdan birini okurken öneririz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kevin Bruckert

    Kevin Brucke

    30 Aralık 2006
  • Noam Erez

    Noam Erez

    3 NİSAN 2012
  • RobertDuskin

    RobertDuskin

    12 HAZİRAN 2008