Wie erhöht sich in diesem Fall die Erweiterung der Prototypkette?

8

Ich habe eine lange angenommene Annahme, dass prototype chains führte zu einer Verschlechterung der Leistung für Eigentum Accessoren. Ich versuchte zu erklären, dass auf den Getter ausblenden oder hinzufügen im Proto-Objekt , als ein schneller Benchmark, den ich zusammenstellte , zu dem ziemlich entgegengesetzten Ergebnis von dem, was ich erwartet hatte, führte / p>

Was ist hier los? Fehle ich etwas Offensichtliches, oder zeigt das direkt, dass meine (und andere) Annahmen über die Leistung von Eigentum Accessoren auf der prototype Kette falsch war?

Einrichtung

%Vor%

Test 1

(Steuerelement, ohne prototype )

%Vor%

Test 2

(experimentieren Sie mit prototype )

%Vor%

Ergebnis

Test 1 lief 92,85% langsamer als Test 2, was bedeutet, dass das Platzieren von get bar () {} in der Kette prototype und nicht in den eigenen Eigenschaften des Objekts zu einer 14-fachen Geschwindigkeitssteigerung für den Eigenschaftenaccessor führt. In Object.create() finden Sie Informationen zum Layout des Objekts ist anders.

Test 1

79,323,722 ops / s ± 0,34%

Test 2

1,108,762,737 ops / s ± 0,15%

Getestet unter Windows 10 Intel i7-7700K CPU @ 4.20GHz mit Google Chrome 63.0.3239.132 (Official Build) (64-Bit)

    
Patrick Roberts 20.02.2018, 20:05
quelle

1 Antwort

3

Soweit ich weiß, gelten diese Details nur für die V8-Engine. Ich bin mir nicht sicher, wie direkt dies der Implementierung von Firefox entspricht.

Ohne den Prototyp erstellt V8 versteckte Klassen, um die Eigenschaften Ihres Objekts zu unterstützen. Für jede neue Eigenschaft wird eine neue versteckte Klasse erstellt, und dann wird ein Übergang von der vorherigen ausgeblendeten Klasse zur neuen erstellt.

Dies geschieht jedoch nicht mit Prototypen und ist aus den Gesprächen, die ich in Bezug auf das Thema geführt habe, etwas wenig bekannt. Mit anderen Worten: Ja, Prototypen sind schneller.

  

Um Prototypen zu optimieren, verfolgt V8 ihre Form anders als reguläre Objekte. Anstatt den Übergangsbaum zu verfolgen, passen wir die verborgene Klasse an das Prototypobjekt an und behalten es immer schnell - Toon Verwaest (V8-Entwickler)

Dieses Setup findet während der Generierung dynamischer Maschinencodes statt. Der Unterschied zwischen den beiden Setups, die Sie sehen, ist der Unterschied zwischen dem komplexeren versteckten Klassenpfad und dem benutzerdefinierten Pfad. Oder, namentlich, der Unterschied zwischen dem Objekt "fastPropertiesWithPrototype" und dem Objekt "slowProperties", wobei das letztere Objekt den Wörterbuchmodus verwendet.

    
Travis J 20.02.2018, 22:14
quelle