严格模式是否更具性能?

时间:2010-06-30 01:43:38

标签: javascript

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

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

4 个答案:

答案 0 :(得分:21)

严格模式并非真正与性能有关,它是语言的strict variant,其主要目标是为了避免被认为是容易出错的功能

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

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

另见:

答案 1 :(得分:21)

  

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

是否打算这样做,我不确定,虽然我认为答案是肯定的。

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

答案 2 :(得分:11)

根据此测试"严格模式" 可以 快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

<小时/> 有趣的是,在&#34;严格模式&#34;!

中,对参数数组的操作可以快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

答案 3 :(得分:3)

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

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

有两点需要注意:

  1. ECMAScript 3中不存在对严格模式的检查。虽然它相对轻量级,但与ECMAScript 3对应项相比,符合JavaScript的实现现在至少运行一次额外的条件检查。是的...我知道这样的一张支票会烧掉很少的时钟周期,但是很少有东西加起来
  2. 由于严格模式主要是JavaScript的解析时功能,因此当某些网站(例如,SunSpider)启用严格模式时,您最喜爱的浏览器不会显示性能下降。也就是说,在执行代码之前会导致性能下降,这意味着可以可以被最终用户察觉,但使用 Date 对象可以在很大程度上无法估量测量块执行时间