Performance bei Vererbung.
Christian S.
- javascript
0 nam
Hi,
ich habe gerade diesen Artikel gelesen.
Er beschreibt, wie Vererbung im MS ASP.NET Ajax Framework funktioniert.
kurz gesagt: es werden per for-in Schleife alle members des prototype Objekts der Basisklasse runter kopiert, in den prototype der Kindklasse (rekursiv).
(siehe Listing 6).
Ich kenne Vererbung eher so: this.prototype = new baseClass();
Weiter unten steht dann:
===
Why are the properties copied from the parent constructor function’s prototype to the current prototype? In other words, why are the prototypes flattened? Presumably, for reasons of performance. If all of the properties are copied to the lowest prototype in the prototype chain, then the prototype chain never needs to be climbed to resolve the value of any property.
===
Was ist an dieser Aussage dran? Laufen meine Skripte schneller, wenn ich die dort verwendete Methode benutze? Dauert es wirklich länger, wenn man die "prototype-Chain" abklappern muss? Also wenn man an einem Objekt eine Methode aufruft, die irgendwo weit oben in einem Basis-protoype steckt.
Dauert dafür der Vererbevorgang vielleicht länger (wegen der for-in Schleife)?
Gruß!
Hi
Etwas ähnliches haben wir kürzlich hier besprochen.
Laufen meine Skripte schneller, wenn ich die dort verwendete Methode benutze? Dauert es wirklich länger, wenn man die "prototype-Chain" abklappern muss?
Die Antwort lautet (wahrscheinlich wie bei allen Performancefragen): Kommt drauf an!
Bei den meisten Scripts ist die Prototype-Chain vergleichsweise kurz. Will sagen, man landet relativ schnell beim window-Objekt, das zumindest in den Browsern das letzte Glied in der Kette darstellt. Zudem sind aktuelle Javascript-Engines ziemlich schnell sind in der Auflösung der Chain. Da dürfte ein solches «Chain-Flattening» zuviel Overhead verursachen.
Das Abflachen der Kette lohnt sich nach meiner Einschätzung also nur, wenn diese tatsächlich ziemlich lang ist und sehr oft auf die (vererbten) Identifier weiter oben in der Kette zurückgegriffen wird.
Konkret mit Zahlen kann ich diese Vermutung aber nicht unterlegen. (*1)
Wenn du's für deine Anwendung genau wissen willst, kommst du in jedem Fall nicht um einen Micro-Benchmark herum, der dann auch in allen Browsern durchgeführt werden sollte.
Gruss,
nam
*1) Bei Zeit und Lust und Gelegenheit kann ich ja mal ein Benchmark kreieren. Ist meistens interessant.