严格模式是否更具性能?

sje*_*397 68 javascript

一般情况下,在"严格模式"下在浏览器中执行javascript会使其性能更高吗?是否有任何主流浏览器进行额外的优化或使用任何其他技术来提高严格模式下的性能?

重新说一下,在其他目标中,严格模式是否允许浏览器引入其他优化或其他性能增强?

Jef*_*den 23

在其他目标中,严格模式是否允许浏览器引入其他优化或其他性能增强?

无论是否打算这样做,我都不确定,尽管我认为答案是肯定的.

但我可以肯定地说,严格模式确实提供了这些机会,浏览器将实施它们 - 无论提供这些机会是否是ECMA委员会的有意目标.但是,我不希望立即采取所有这些机会.在许多情况下,口头禅可能首先是正确性,后来是性能,因为严格模式现在还没有被广泛使用.(我在Mozilla的JavaScript引擎上工作并实现了严格模式的各个部分,我们通过这种方式实现它作为一般规则 - 尽管如果我尝试的话,我可能会想到一两个例外.)

  • 是的,严格模式的设计目标是启用词法范围(这就是禁用此类内容的原因).这是第一天的意图. (4认同)

CMS*_*CMS 21

严格的模式是不是真正的性能,它严格变种的语言,它的主要目标是避免了被认为是容易出错的功能.

基本上它的目标是使语言更安全,引入很多语义变化,也进行额外的错误检查,并且错误是嘈杂的,在非严格的代码中,事物只会默默地失败.

关于性能,我认为浏览器厂商现在很难实现严格模式,问题是JS引擎大多基于ECMAScript 3,并且实现严格模式并不容易,因为严格的范围非常灵活,你可以混合使用非严格和严格的代码.

也可以看看:

  • 来自[here](http://clipperhouse.com/blog/post/Javastrict.aspx)(似乎可信):'John [Resig]未提及的是严格模式可能会带来更高的性能.如果浏览器被告知"我声明这段代码是好的和正确的",它可以花更少的时间处理歧义,并开始掌握手头的业务. (4认同)

int*_*dis 13

根据这项测试,"严格模式" 可以快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>
Run Code Online (Sandbox Code Playgroud)

这可以在这里测试:http: //jsperf.com/strict-mode


有趣的是,在"严格模式"下,对arguments数组的操作可以快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>
Run Code Online (Sandbox Code Playgroud)

这是jsPerf测试:http://jsperf.com/strict-mode-arguments

  • 在我的Chrome浏览器上,今天在2017年,非严格版本分别比基准测试中的严格版本慢约15%和70%.我想这意味着性能差异比以前小,但仍然相当重要.知道造成这些性能差异的原因吗? (2认同)