2010-06-30 77 views
57

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

为了让浏览器引入额外的优化或其他性能增强,稍微改写一下是严格模式:

+0

哪些浏览器支持的ECMAScript 5现在呢? – 2010-06-30 01:49:38

+3

@Jamie http://kangax.github.com/es5-compat-table/ – 2010-06-30 01:53:28

+0

@Jamie Wong - 见http://stackoverflow.com/questions/2280115/ecmascript-5-browser-implementation – sje397 2010-06-30 01:55:21

回答

18

意,其中包括它的其他目标的严格模式,允许浏览器引入额外的优化或其他性能哪些改进?

无论它是要做到这一点,我不知道,但我想答案是肯定的。

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

+4

是的,严格模式的设计目标是启用词法作用域(这就是为什么像禁用)的原因。这是从第一天开始的意图。 – 2014-02-16 17:51:30

19

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

基本上它的目标是使语言安全,引入很多语义的变化,还额外错误检查制成,并且误差修改是喧闹的,非严格的代码的东西只能默默的失败。

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

参见:

+0

为链接+1。我不太明白第三句与表演有什么关系。 – sje397 2010-06-30 09:38:59

+4

from [here](http://clipperhouse.com/blog/post/Javastrict.aspx)(似乎可信):'John [Resig]没有提及的是严格模式可能会带来更高的性能。如果浏览器被告知“我声明这个代码是好的和正确的”,那么它可以花更少的时间来处理歧义,并且能够立即开展业务。“ – sje397 2010-06-30 12:14:09

+0

@ sje397:'strict'模式的另一个好处是,如果一个函数声明一个局部变量'foo'并且不定义*捕获它的任何嵌套函数,它会在第一次读取之前将一个数字存储到'foo'中,并且永远不会将任何数字以外的数字存储到'foo'中,那么被调用的函数(或其他任何东西)都不会导致'foo'存储除数字以外的任何内容。确定前面提到的条件很容易,并且使用数字的处理可以比使用恰好是数字的多态对象更快地进行。 – supercat 2015-01-21 19:02:59

3

For大部分,没有。如果你仔细检查的ECMAScript 5标准的文档,你会发现,相当多的伪代码严格模式的所有匹配算法量:

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

有两点需要注意一下:

  1. ECMAScript 3中不存在对严格模式的检查。虽然它相对轻量级,但与ECMAScript 3相比,JavaScript的符合性实现现在至少运行了一次额外的条件检查。是啊......我知道像这样的一次检查会导致很少的时钟周期,但有些东西会加起来
  2. 因为严格模式主要是JavaScript的解析时间功能,所以您最喜欢的浏览器不会显示太多性能当某些网站(例如SunSpider)启用严格模式时,请减少。也就是说,会出现性能劣化时执行这意味着它代码之前可以是可察觉到最终用户但使用日期对象来测量块执行时间
+1

但你怎么知道v8没有利用严格模式进行额外的优化? – UpTheCreek 2013-09-04 09:10:04

+5

我从事Internet Explorer 10严格模式性能测试等工作。我可以给你的最好的例子是,如果你有两个相同的大型JavaScript文件,没有严格的模式违规*,*只有其中一个包含“严格使用”,没有它的那个会运行得更快,因为它没有运行严格模式检查。仅仅因为您在严格模式中删除了对'with'的支持,并不意味着您可以直接从解析器中删除它(仍然必须允许它在非严格模式下)。不,相反,你的DLL的大小实际上已经增加了*和执行时间一样。 – Dave 2013-09-18 15:23:18

9

在很大程度上是无法估量的根据本试验“严格模式“可以快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

+1

在我的Chrome浏览器中,今天2017年,非严格版本比基准测试版中的严格版本分别慢大约15%和70%。我想这意味着性能差异比以前小,但仍然相当重要。任何想法是什么导致这些性能差异? – 2017-06-22 11:00:03