Wie performant ist jQuery.proxy()?

Immer wieder liest man im Netz, dass der Einsatz von jQuery.proxy() auf die Performance geht von Javascript-Anwendungen geht. Nachdem ich in meinem Artikel zu Javascript und Clean Code den exzessiven Einsatz von jQuery.proxy() quasi propagiert habe, wollte ich wissen, was an dieser Aussage wirklich dran ist.

Ich habe ein bisschen mit JSFiddle herumgespielt und wollte mit einem Skript einen allgemeingültigen Vergleich von jQuery.proxy mit einer einfachen anonymen Javascript-Funktion durchführen. Das war mir allerdings nicht möglich. Denn es gibt zu viele Faktoren, die Einfluss nehmen:

  • Anzahl erzeugter Proxies
  • Anzahl von Proxy-Aufrufen
  • Zeit, die innerhalb der Funktion vergeht
  • Rechenleistung

Es ist nicht möglich, mit einer einzigen Formel die Performance oder Performance-Unterschiede zwischen Proxy und anonymer Funktion zu berechnen. Denn das Ergebnis variiert sehr stark in Abhängigkeit von den Faktoren. Auch das  Ergebnis, dass Proxies performanter sind, lässt sich mit bestimmten Parametern erzeugen.

Daher war mein Ansatz zu schauen, wie viele Proxies ich selbst in der Realität verwende und wie häufig diese aufgerufen werden. Als Beispiel habe ich die Anwendung monkkee verwendet, in der fast alle Callbacks mit jQuery.proxy arbeiten. Ich habe mir eine aufwändige Benutzerinteraktion herausgepickt und gemessen. Die Messdaten habe ich nochmal deutlich aufgerundet und habe folgendes Testszenario angenommen.

  • Anzahl Callbacks: 100
  • Anzahl Callbackaufrufe: 1000
  • Dauer Benutzerinteraktion: 1 s

Mit dem JSFiddle http://jsfiddle.net/bjoerne/tbQX4/ lässt sich nun der Test durchführen. Der Test erwartet Parameter, die aber bereits mit Defaultwerten vorbelegt sind.

jquery_proxy_test_parameters

Die ersten beiden Parameter entsprechen genau meinem Testszenario. Der dritte Parameter muss je nach Browser und Maschine manuell angepasst werden, so dass die Dauer eines Testdurchlaufs ungefähr 1 s dauert.

Der Test funktioniert so, dass immer abwechselnd ein Testdurchlauf auf Basis einer anonymen Funktion und ein Testdurchlauf auf Basis von jQuery.proxy ausgeführt werden. Aus den Ergebnissen werden Durchschnittswerte gebildet. Der Test startet durch Klick auf Start und läuft so lange bis Stop gedrückt wird.

jquery_proxy_test_results

Beispiel für einen Testlauf

Fazit

Ich habe den Test auf mehreren Geräten und Browsern ausgeführt. Anonyme Funktionen haben meist marginal die Nase vorn, aber in so geringem Maße, dass ich mir in meinem Szenario keine Sorgen machen muss, dass jQuery.proxy einen negativen Einfluss auf die Performance meiner Anwendung hat.

Potentielle Probleme

Beim Herumspielen habe ich aber schon festgestellt, dass es Situationen gibt, in denen man aufpassen muss:

  • Erzeugung vieler Proxies
  • Häufiges Aufrufen dieser Proxies
  • Recht geringer Dauer innerhalb der aufgerufenen Funktion

Wenn eine Anwendung bezüglich dieser Punkte extreme Ausmaße annimmt, ist ein sorgfältiger Blick darauf angebracht. Vielleicht hilft ja mein JSFiddle bei einem eigenen Test.

 

bjoerne_com_bjoern_weinbrenner_softwareentwickler_icon_leistungen_02

Lust auf mehr? Als JavaScript-Entwickler und Softwarearchitekt kann ich Sie in Ihren Projekten unterstützen. Melden Sie sich gerne bei mir.

2017-01-28T14:27:39+00:00 13.10.2013|Tags: , , , |0 Kommentare

Hinterlassen Sie einen Kommentar