Wird Funktion.der Prototyp.bind () - immer langsam sein?
Ich Schreibe ein open source javascript-Bibliothek, und ich nutze .bind()
Methode sehr stark, da habe ich eine Idee, die Objekt-orientierten code sieht mehr klar dann. (umstritten, obwohl)
Beispiel
A1:
var that = this;
setTimeout(function () {
that.method();
}, 0);
vs
B1:
setTimeout(this.method.bind(this), 0);
Oder, eine mehr praktische code-Teil
A2:
remoteDataSource.getData(function (a, b, c, d) {
obj.dataGetter(a, b, c, d);
})
vs B2:
remoteDataSource.getData(obj/* or prototype */.dataGetter.bind(obj));
Ich eine nicht-native bind
für ältere Browser, und alles ging perfekt, bis ich eröffnete ein jsperf benchmark für bind.
Sieht es aus wie code mithilfe bind
ist 100-mal langsamer. Jetzt, vor dem umschreiben aller meiner Bibliothek, ich habe eine Frage für diejenigen, die vertraut sind mit javascript-engines:
Gibt es eine Wahrscheinlichkeit, dass sich eine neue Funktion, die bind
wird optimiert
bald, oder es ist keine chance, denn der JavaScript-Architektur die Grenzen?
- Gefunden ein Verwandte Frage stackoverflow.com/questions/8656106/...
- Und eine der besten Lösungen ist: jsperf.com/bind-vs-emulate/6
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst fest jsperf http://jsperf.com/bind-vs-emulate/13.
=Sollten Sie nicht neu erstellen, statische Funktionen in der benchmark. Das ist nicht realistisch, weil im echten code statische Funktionen werden nur einmal erstellt.
Können Sie sehen, dass
var self = this
Muster noch etwa 60% schneller. Aber es erfordert eine definition die Funktion inlined werden, wo Sie binden können, von überall und haben daher bessere Wartbarkeit.Nein, die eingebauten bind-Semantik sind lächerlich verworren.
Wenn ich Binde, ich will nur dieses:
Wenn ich wollte, pre-Argumente gelten, oder verwenden Sie einige Tiefe Konstruktor der schwarzen Magie, ich möchte eine völlig andere Funktion für, die. Ich habe keine Ahnung, warum jeder das gehörte binden.
<rant>Btw, das gleiche problem ist mit fast alles, was in eingeführt ES5, die Bestrafung der Allgemeine Fall durch zwingen Implementierungen behandeln einige theoretische edge-Fall, die nicht plausibel für jeden relevant, der in der Praxis. Die nächste Sprache, die version ist weiter auf dem gleichen Weg.</rant>
Den emulierten binden nicht selbst versuchen zu emulieren, binden an alle. Und selbst wenn Sie versuchen, ihn nachzuahmen, können Sie nicht in der Lage
tun es ganz so, das ist einfach nicht fair.
So, alles andere gleich* der eingebaute binden nicht schneller als common-sense custom Bindung, die nur bindet.
*In JITs Benutzer-code ohne erhebliche Nachteile für built-in-code. In der Tat, sowohl SM-und V8-Umsetzung viele built-ins
in Javascript.
.bind()
zu sein, der Schnellste, sondern der langsamste in Chrom. Sie haben viele gute Punkte, aber die Schlussfolgerung das integrierte binden nicht schneller sein, scheint nicht richtig. Während eine gebundene Funktion wird bestimmte overhead, es entfällt auch ein gewisser Aufwand. Insbesondere braucht er nicht zu rufen in einer anderen Funktion, sondern teilt dem Körper der ursprünglichen Funktion, also es ist sehr nah an aufrufen-das original. Noch braucht Sie zum Durchlaufen der Geltungsbereich von Variablen, um die Werte gebunden. Also ich denke, es wird immer nach unten kommen, um die Umsetzung detaillierter als spec.Derzeit, Ende 2013, die beste Lösung wird sein, die Umsetzung handgemachte Versionen von
Function.prototype.bind
und entweder überschreiben des Herstellers "native" (nicht wirklich native) - Methode mit Ihren eigenen javascript-code, oder verwenden Sie Ihre eigenenmyBind
.Function.prototype.apply
ist ziemlich schnell, und der Array-slicing, concating und verschiebt sich langsam, so verwenden Sie besserapply
statt, wennbind
oder minimieren Argumente Manipulationen inmyBind
Funktion. Verlassen, dass Sie ohne die Funktionen der Parameter pre-filling.Also ich sehe keine Notwendigkeit, in umschreiben und alles wieder zu Sperrungen (hässlich
var that = this;
). Lassen Sie die funktionale Natur von javascript gewinnen.Mehr details und funktionierende code-Beispiele hier:
http://jsperf.com/function-bind-performance/4
http://jsperf.com/function-bind-performance/5
http://jsperf.com/bind-vs-emulate/4 .. 10.
Zusammenfassung: Problemumgehungen gefunden, also die sind nicht schlecht. Verwenden Sie tapfer. Wenn Sie nicht mit vollem Funktionsumfang
bind
wird, gehen Sie nicht zu weit von der ursprünglichen Konzeption, wie ich fand keine Gründe, es ist nicht implementiert in C noch nicht. Es ist eine Frage der Zeit.