SORU
21 AĞUSTOS 2013, ÇARŞAMBA


En iyi Çöp Toplayıcı aktivitesini azaltmak için uygulamalar Javascript

Saniyede 60 kez çağrılan ana bir döngüye sahip olan oldukça karmaşık bir Javascript uygulaması var. Çöp toplama bir sürü şey var gibi görünüyor ('testere dişi' Hafıza zaman çizgisinden çıktı Chrome dev tools) - ve bu genellikle uygulamanın performansını etkiler. temel

Yani, çöp toplayıcı yapmak zorunda iş miktarını azaltmak için en iyi uygulamaları araştırma yapmaya çalışıyorum. (Çoğu bilgi bulundum bulur web saygılar kaçınarak, bellek sızıntıları, bu biraz farklı bir soru - hatıram almak serbest, Sadece orada çok fazla çöp toplama oluyor.) Bu çoğunlukla yeniden nesneleri aşağı mümkün olduğunca geldiğini varsayıyorum, ama tabii ki şeytan ayrıntıda gizlidir.

App 'sınıflar' John Resig's Simple JavaScript Inheritance boyunca çizgiler. yapılandırılmıştır

Bence tek sorun, bazı fonksiyonlar çağrılabilir binlerce kez başına ikinci (olarak kullanılan yüzlerce zamanlarında her yinelemenin ana döngü), ve belki de yerel çalışma değişkenleri bu işlevler (dizeleri, diziler, vb.) sorun olabilir.

Bildiğim kadarıyla nesne havuzu için geniş ve ağır nesneleri (ve kullanıyoruz bu bir derece) ama aradığım teknikleri uygulanabilir kurulu arasında, özellikle ilgili işlevleri denilen pek çok kez sıkı döngüler.

Teknikleri çöp toplayıcı yapmam gereken çalışıyorum miktarını azaltmak için ne kullanabilirim?

Ve, teknikler çöp en tahsil ediliyor tanımlamak için kullanılan olabilir belki de? (Farly büyük bir kod temeli, yığın anlık karşılaştırılması çok verimli olmamıştır

CEVAP
23 AĞUSTOS 2013, Cuma


GC en aza indirmek için yapmanız gereken bir çok şey deyimsel JS çoğu diğer senaryolarda sayılan karşı yayık, lütfen tavsiyelerimi bakılırsa akılda kapsamında devam et.

Ayırma çeşitli yerlerde modern tercüman olur:

  1. [...] {} değişmez sözdizimi) new) ya da bir nesne oluşturduğunuzda.
  2. Dizeleri bitiştirmek.
  3. Kapsam girdiğinizde işlevi bildirimleri içerir.
  4. Bir istisna tetikleyen bir eylem gerçekleştirdiğinizde.
  5. Sana bir işlev ifadesi değerlendirdiğimizde: (function (...) { ... }).
  6. Object(myNumber) Number.prototype.toString.call(42) gibi Nesne için zorlayan bir işlem gerçekleştirdiğinizde
  7. Yerleşik çağırdığınızda o Array.prototype.slice gibi bu başlık altında bu mu.
  8. arguments parametre listesi üzerinde yansıtmak için kullanın.
  9. Ne zaman normal bir ifade ile dize veya bir maç bölmek.

Mümkünse bu havuz ve yeniden nesneleri kaçının.

Özellikle, fırsatlar için dışarı bak

  1. Uzun ömürlü yüksek kapsam içine-kapalı durumu üzerinde herhangi bir veya birkaç bağımlılıkları olan iç fonksiyonları çekin. (Closure compiler gibi bazı kod minifiers iç satır içi işlevleri ve GC performansınızı artırabilirsiniz.)
  2. Dizeleri yapısal verileri temsil etmek için kullanarak veya dinamik adresleme kaçının. Her biri birden çok nesne ayırmalarını gerektirir beri özellikle sürekli split kullanarak veya düzenli ifade maçları ayrıştırma kaçının. Bu sık sık arama tabloları ve dinamik DOM içine tuşları ile düğüm Kimlikleri olur. Örneğin, lookupTable['foo-' x] document.getElementById('foo-' x) hem bir dize birleştirme olmadığı bir ayırma gerektirir. Sık sık yeniden bitiştirmek yerine ömürlü uzun nesneler için anahtarları ekleyebilirsiniz. Destek için gerekli tarayıcıları bağlı olarak, Map tuşları direkt olarak nesneleri kullanmak mümkün olabilir.
  3. Normal istisnalar kod yollar yakalamak kaçının. ** 12, yerine if (!opCouldFailOn(x)) { op(x); } else { ... }.
  4. Bir sunucu için bir mesaj iletmek için dizeleri, örneğin oluşturma kaçamazsın, iç doğal bir tampon kullanır JSON.stringify gibi yerleşik kullanın birden fazla nesneleri ayırmak yerine içerik birikir.
  5. -Frekansı yüksek olaylar için geri kullanmaktan kaçının, ve nerede, bir geri arama mesaj içeriği devlet yeniden oluşturur uzun ömürlü bir fonksiyon (1) geçirin.
  6. Bu kullandığınız işlevleri çağrıldığında dizi gibi bir nesne oluşturmak zorunda beri arguments kullanmaktan kaçının.

JSON.stringify giden ağ iletileri oluşturmak için önerdim. Ayrıştırma giriş mesajlar JSON.parse kullanarak belli tahsis ve büyük iletileri için bir sürü içerir. Eğer ilkel dizileri olarak gelen mesajları temsil edebilir, o zaman ayırmaları bir çok kaydedebilirsiniz. Etrafında ayırmaması bir ayrıştırıcı oluşturmak için yalnızca yerleşik String.prototype.charCodeAt. Sadece kullanan karmaşık bir biçim için bir ayrıştırıcı rağmen okumak için cehennem olacak.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bennythecoder

    Bennythecode

    25 Mart 2008
  • Call Me Howard

    Call Me Howa

    18 AĞUSTOS 2012
  • TheJoeycool2010

    TheJoeycool2

    12 Temmuz 2010