2012-01-19 26 views
8

HTML5 Canvas ile bazı animasyonlar yapıyorum diyelim. Ben tercih olacaktır bir nesnenin yöntemini hareketlendirmek için arıyorum, performans akıllıca (IE8 umurumda değil varsayarak):setTimeout nesne yöntemi üzerinde - ES5 bağlama veya kapatma?

setTimeout(this.render.bind(this), 15); 

veya

var self = this; 
setTimeout(function() { self.render() }, 15); 

Benim özellikle böyle değil görsel anlamda bir fark yaratmak için yeterince yoğun; Sadece en iyi uygulamayı bulmaya çalışıyorum.

bind ile yeni bir işlev oluşturmanın bir kapanış oluşturmaya göre daha az masraf olacağını düşünürdüm, ancak uzmanlara sormak istedim.

+1

Bu benim için en iyi optimizasyon gibi kokuyor, sonra tekrar ne senin sorununun ne olduğunu bilmiyorum, ama bunun% 75'inin önemi olmadığını söylemesi güvenli olduğunu düşünüyorum – mkoryak

+0

Her ikisi de bir kapanma oluşturuyorlar, tek fark şudur Bu fonksiyonlar ... –

+2

@mkoryak - daha fazla iş yapıyorsanız sadece aşırı optimizasyon var. Her ikisi de uygulamak için önemsiz ve hangisinin (potansiyel olarak) daha performanslı olduğunu merak ediyordum. –

cevap

5

JavaScript performans soruları zordur, çünkü farklı motorlarda çok farklı performans özellikleri vardır. Bir motorda hızlı olan şey bir diğerinde yavaştır.

Kapanışınız çok hızlı olmalıdır; her şeyden önce, tüm işlevler kapanır ve self değişkeniniz hemen içeren içerikte tanımlanmıştır (bu nedenle, kapsam zincirini çok fazla görmüyor).

Ancak, teorik olarak, ES5 özelliklerini yerel olarak destekleyen bir motor, bind'un daha hızlı çalışmasını sağlayarak daha da hızlı bir şekilde çalışabilir (yalnızca bir kapsam zinciri aramasına bile gerek yoktur).

Önemli mi? Hayır. Size mantıklı olanı kullanırdım. IE8'in henüz ES5 özelliklerine sahip olmayan tek bir tarayıcı olduğunu unutmayın (her zaman ES5 özelliklerinden birini kullanabilirsiniz, ancak bazı ES5 özelliklerinden farklı olarak, bind, ES3 kodunda   — ES0 koduyla mükemmel şekilde öykünebilir. Bunu yapmak için, bazı motorlarda kapanmadan daha yavaş olabilecek call/apply'u kullanmaları gerekir.

İlgili konular