Ist die Ausführung von Javascript in einem Browser im "strengen Modus" im Allgemeinen leistungsfähiger? Führt einer der wichtigsten Browser zusätzliche Optimierungen durch oder verwendet er andere Techniken, die die Leistung im strengen Modus verbessern?
Ist der strikte Modus neben seinen anderen Zielen dazu gedacht, Browsern die Möglichkeit zu geben, zusätzliche Optimierungen oder andere Leistungsverbesserungen einzuführen?
javascript
sje397
quelle
quelle
with
Schlüsselwort nicht nur eine schlechte Leistung erbringt, sondern es nur in der Sprache hat, verlangsamt die gesamte Sprache. Dieser Link aus der Antwort von CMS besagt, dass daswith
Schlüsselwort im strengen Modus nicht funktioniert. Dies scheint zumindest auf das Potenzial für eine gewisse Beschleunigung hinzuweisen .Antworten:
Ob dies beabsichtigt war oder nicht , bin ich mir nicht sicher, obwohl ich denke, dass die Antwort ja ist.
Ich kann jedoch mit Sicherheit sagen, dass der strikte Modus diese Möglichkeiten bietet und die Browser sie implementieren werden - unabhängig davon, ob die Bereitstellung dieser Möglichkeiten ein beabsichtigtes Ziel für das ECMA-Komitee war. Ich würde jedoch nicht erwarten, dass all diese Gelegenheiten sofort genutzt werden. In vielen Fällen ist es wahrscheinlich, dass das Mantra zuerst die Korrektheit und später die Leistung ist, da der strenge Modus derzeit nicht weit verbreitet ist. (Ich arbeite an der JavaScript-Engine von Mozilla und habe verschiedene Teile des strengen Modus implementiert. Wir implementieren sie in der Regel auf diese Weise - obwohl ich mir wahrscheinlich ein oder zwei Ausnahmen vorstellen könnte, wenn ich es versuchen würde.)
quelle
Im strengen Modus geht es nicht wirklich um Leistung, sondern um eine strenge Variante der Sprache. Das Hauptziel besteht darin, Fehler zu vermeiden, die als fehleranfällig gelten .
Grundsätzlich ist es das Ziel, die Sprache sicherer zu machen , viele semantische Änderungen einzuführen, außerdem werden zusätzliche Fehlerprüfungen durchgeführt und Fehler sind verrauscht, in nicht-strengem Code scheitern Dinge nur stillschweigend.
In Bezug auf die Leistung fällt es Browser-Anbietern derzeit schwer, den strengen Modus zu implementieren. Das Problem besteht darin, dass die JS-Engines hauptsächlich auf ECMAScript 3 basieren und die Implementierung des strengen Modus nicht einfach ist, da der Umfang der Strenge sehr flexibel ist. Sie können nicht strengen und strengen Code mischen.
Siehe auch:
quelle
strict
Modus ist , dass , wenn eine Funktion eine lokale Variable deklariertfoo
und nicht nicht definiert alle verschachtelten Funktionen , die Erfassung es, es eine Zahl in speichert ,foo
bevor das erste Mal las es und nie speichert etwas anderes als eine Zahl infoo
, dann Eine aufgerufene Funktion (oder etwas anderes) kannfoo
auf keinen Fall dazu führen , dass etwas anderes als eine Zahl gespeichert wird. Es ist ziemlich einfach festzustellen, dass die oben genannten Bedingungen gelten, und das Arbeiten mit Zahlen kann viel schneller erfolgen als das Arbeiten mit polymorphen Objekten, bei denen es sich zufällig um Zahlen handelt.Gemäß diesem Test „Strict - Modus“ kann etwa 25% schneller sein.
<div id="a"> Q </div> <div id="b"> Q </div> <script> Benchmark.prototype.setup = function() { function d(i) { var x = '999'; y = eval("y = 8;"); var z = x + y + i; document.getElementById('a').innerHTML = z; } function c(i) { 'use strict' var x = '999'; var y = eval("y = 8;"); var z = x + y + i; document.getElementById('b').innerHTML = z; } }; </script>
Dies kann hier getestet werden: http://jsperf.com/strict-mode
Interessanterweise kann die Manipulation des Argumentarrays im "strengen Modus" etwa sechsmal schneller sein!
<script> Benchmark.prototype.setup = function() { var nonstrict = (function() { return function (arg1) { var index; for (index = 1; index < arguments.length; ++index) { arguments[0] += arguments[index]; } return arguments[0] - arg1; }; }()); var strict = (function() { "use strict"; return function (arg1) { var index; for (index = 1; index < arguments.length; ++index) { arguments[0] += arguments[index]; } return arguments[0] - arg1; }; }()); var result; }; </script>
Hier ist der jsPerf-Test: http://jsperf.com/strict-mode-arguments
quelle
Zum größten Teil nein . Wenn Sie das ECMAScript 5-Standarddokument genau untersuchen, werden Sie feststellen, dass so gut wie alle Vorkommen des Strict Mode in den Pseudocode-Algorithmen Folgendes betragen:
if (isStrictMode) { //throw an (early) SyntaxError or TypeError } else { //return }
Hierbei sind zwei Dinge zu beachten:
quelle