严格模式性能更好吗?

IT技术 javascript
2021-02-27 15:38:03

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

稍微改写一下,除了其他目标之外,严格模式是否旨在允许浏览器引入额外的优化或其他性能增强?

4个回答

除了其他目标之外,严格模式是否旨在允许浏览器引入额外的优化或其他性能增强?

我不确定它是否打算这样做,尽管我认为答案是肯定的。

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

是的,严格模式的设计目标是启用词法范围(这就是像 with 之类的东西被禁用的原因)。这是从第一天起的意图。
2021-05-16 15:38:03

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

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

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

也可以看看:

这里(似乎可信):'John [Resig] 没有提到严格模式可能会带来更好的性能。如果浏览器被告知“我声明这段代码是好的和正确的”,它可以花更少的时间处理歧义,并继续处理手头的业务。
2021-04-24 15:38:03
@sje397:strict模式的另一个好处是,如果一个函数声明了一个局部变量foo并且没有定义任何捕获它的嵌套函数,它会foo在第一次读取之前将一个数字存储到 中,并且除了数字之外从不存储任何其他内容foo,然后被调用的函数(或其他任何东西)无法foo保存数字以外的任何东西。很容易确定上述条件成立,并且处理数字比处理恰好是数字的多态对象要快得多。
2021-05-01 15:38:03
+1 为链接。我不太明白第三句话与性能有什么关系。
2021-05-13 15:38:03

根据这个测试,“严格模式”可以快 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

在我的 Chrome 浏览器上,2017 年的今天,非严格版本在您的基准测试中分别比严格版本慢 15% 和 70%。我想这意味着性能差异比以前小了,但仍然相当显着。知道是什么导致了这些性能差异?
2021-05-15 15:38:03

大多数情况下,没有如果您仔细检查 ECMAScript 5 标准文档,您会注意到伪代码算法中几乎所有出现的严格模式都相当于:

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

对此有两点需要注意:

  1. ECMAScript 3 中不存在对严格模式的检查。虽然它相对轻量级,但与 ECMAScript 3 对应物相比,JavaScript 的合规实现现在至少运行了一项额外的条件检查。是的...我知道像这样的单次检查会消耗很少的时钟周期,但是小事情加起来
  2. 因为严格模式主要是 JavaScript 的一个解析时间特性,所以当为某些网站(例如 SunSpider)启用严格模式时,您最喜欢的浏览器不会表现出太大的性能下降。也就是说,性能下降发生代码执行之前,这意味着最终用户可能会察觉到但使用Date对象来测量块执行时间在很大程度上是无法衡量的
但是您怎么知道例如 v8 没有利用严格模式进行额外优化?
2021-04-23 15:38:03
我致力于对 Internet Explorer 10 的严格模式进行性能测试等。我可以给你的最好的例子是,如果你有两个相同的大 JavaScript 文件,没有违反严格模式,并且只有一个包含“使用严格”,那么没有它的一个会运行得更快,因为它没有运行严格模式检查。仅仅因为您在严格模式下删除了对 'with' 的支持,并不意味着您可以完全从解析器中删除它(在非严格模式下仍然必须允许它)。不,相反,您的 DLL 大小实际上随着执行时间的增加增加
2021-05-01 15:38:03