Komprimiert der V8-Cache automatisch reguläre Ausdrücke?

9

Ich weiß also, dass in Javascript ein Regex instanziiert wird, so dass es automatisch kompiliert wird und wenn diese Regex in einer Variablen gespeichert wird, wird sie ohne Neukompilierung wiederverwendet. Beispiel:

%Vor%

Werden jedoch duplizierte reguläre Ausdrücke neu kompiliert oder verwendet V8 (Chrome / Node.js) diese intelligent erneut (wie PHP mit preg_ * Funktionen)?

%Vor%

Um zu verdeutlichen, weiß ich, dass das erste Beispiel eine Zusammenfassung der Regex ergibt. Aber was ist mit dem zweiten Beispiel?

    
ColinM 16.01.2013, 05:48
quelle

2 Antworten

11

Nun, lasst uns herausfinden.

%Vor%

(Öffnen Sie Ihre Konsole und führen Sie das Code-Snippet oben aus, um zu sehen, ob die Ergebnisse für Ihren Browser angezeigt werden.)

Ein Node.js 0.10.36 (V8 3.14.5.9):

%Vor%

An io.js 1.6.3 (V8 4.1.0.27):

%Vor%

Also, ich denke, die Antwort auf Ihre Frage ist YES , V8 kann die Regex automatisch zwischenspeichern.

BEARBEITEN:

Auch wenn V8 fähig ist von einer solchen Optimierung,

Da ich selbst kein V8-Entwickler bin, kenne ich die Antwort auf die Frage, ob Regexe immer automatisch zwischengespeichert werden, nicht. Aber selbst wenn ich die Antwort kenne, kann sich das in Zukunft ändern. Wenn Sie also Code schreiben, würde ich empfehlen, die Regex so zu speichern, dass klar ist, was die Intention für diese Variable ist. Und für das obige Beispiel bedeutet das, dass die Regex-Variable aufgehoben wird der Funktion isFooBar() .

Ein weiteres Problem ist, wie diese Regex erstellt wird. Das obige Beispiel und in der OP-Frage werden mit einem regulären Ausdruck literal deklariert . Wenn Sie jedoch den new RegExp() -Konstruktor , V8 wäre nicht erlaubt die Regex zwischenzuspeichern, da sie sich während der Laufzeit ändern könnte.

    
Timothy Gu 09.04.2015, 00:47
quelle
0

Ссылка

  

In Chrome 9 haben wir ein primitives Zwischenspeichern von RegExp-Ergebnissen entfernt. Das bedeutet, dass wir keine unrealistisch niedrige Zeit mehr brauchen, um die gleiche Operation an der gleichen Eingabe immer wieder zu wiederholen.   Das Caching wurde ursprünglich hinzugefügt, um auf Benchmarks hinzuweisen, die zu simpel waren (unsere eigenen, zu dieser Zeit enthalten) und durch das Hinzufügen eines solchen Cachings zu leicht zu "spielen" waren (was in realen Szenarien keinen Unterschied macht). Die meisten Benchmarks haben sich seitdem so stark verbessert, dass wir beschlossen haben, das Caching (und seinen unvermeidlichen Overhead) zu entfernen.   Der Cache wurde in Version 840 v8 (in Chrome 5 veröffentlicht) hinzugefügt und in Version 5755 (in Chrome 9) entfernt.

    
chx 19.09.2013 09:29
quelle

Tags und Links