Является ли строгий режим более совершенным?

Выполняет ли javascript в браузере в "строгом режиме", что делает его более эффективным, в общем? Может ли какой-либо из основных браузеров сделать дополнительную оптимизацию или использовать любые другие методы, которые повысят производительность в строгом режиме?

Чтобы немного перефразировать, существует строгий режим, предназначенный, среди прочих его целей, для того, чтобы браузеры могли вводить дополнительные оптимизации или другие улучшения производительности?

Ответ 1

Является ли строгий режим, среди других его целей, позволять браузерам вводить дополнительные оптимизации или другие улучшения производительности?

Было ли это намерено делать это, я не уверен, хотя я думаю, что ответ да.

Но я могу с уверенностью сказать, что строгий режим действительно предоставляет эти возможности, и браузеры будут реализовывать их - независимо от того, была ли возможность предоставления этих возможностей преднамеренной целью для комитета ECMA. Однако я не ожидал, что все эти возможности будут приняты немедленно. Во многих случаях мантра, скорее всего, будет правильной, в первую очередь, производительность позже, потому что строгий режим широко не используется прямо сейчас. (Я работаю над движком JavaScript Mozilla и реализовал различные части строгого режима, и мы реализуем его таким образом как общее правило - хотя я мог бы, вероятно, подумать об одном или двух исключениях, если бы попытался.)

Ответ 2

Строгий режим не касается производительности, это строгий вариант языка, его главная цель - избегать того, что считается подверженные ошибкам функции.

В основном его цель - сделать язык более безопасным, вводят множество семантических изменений, также выполняется дополнительная проверка ошибок, а erros - шумные, в нестандартных кодах вещи просто терпят неудачу.

Что касается производительности, я думаю, что теперь у поставщиков браузеров сейчас сложный режим, реализующий строгий режим, проблема в том, что JS-двигатели в основном основаны на ECMAScript 3, а реализовать строгий режим непросто, поскольку масштаб строгости очень гибкий, вы можете смешивать нестрогий и строгий код.

См. также:

Ответ 3

В соответствии с этим тестом "строгий режим" может быть примерно на 25% быстрее.

<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>

Здесь можно протестировать: http://jsperf.com/strict-mode


Интересно, что манипуляция массивом аргументов может быть примерно в 6 раз быстрее в "строгом режиме"!
<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>

Здесь тест jsPerf: http://jsperf.com/strict-mode-arguments

Ответ 4

По большей части нет. Если вы внимательно изучите документ стандартов ECMAScript 5, вы заметите, что почти все вхождения Strict Mode в алгоритмах псевдокода составляют:

  if (isStrictMode) {
      //throw an (early) SyntaxError or TypeError
  }
  else {
      //return
  }

Здесь есть две вещи:

  • Проверки в строгом режиме не существовали в ECMAScript 3. Хотя он относительно лёгкий, в соответствии с реализацией JavaScript в настоящее время выполняется хотя бы одна дополнительная условная проверка по сравнению с их аналогами ECMAScript 3. Да... Я знаю, что одна проверка вроде этого горит очень мало тактов, но небольшие вещи складываются.
  • Поскольку строгий режим - это прежде всего функция времени синтаксического разбора JavaScript, ваш любимый браузер не будет демонстрировать значительного снижения производительности, если для некоторого веб-сайта (например, SunSpider) включен Strict Mode. То есть ухудшение производительности происходит до, что означает, что может быть заметным для конечных пользователей, но в значительной степени неизмеримо использует объект Date для измерения времени выполнения блока