严格模式更高性能?
在“严格模式”下在浏览器中执行JavaScript是否使其更具性能? 任何主stream浏览器是否会进行额外的优化或使用其他技术来提高严格模式下的性能?
为了稍微改写一下,其他目标是严格模式,以允许浏览器引入额外的优化或其他性能增强?
在其他目标中,严格模式是否打算允许浏览器引入额外的优化或其他性能增强?
不pipe它是否打算这样做,我不确定,但我认为答案是肯定的。
但是我可以肯定地说,严格的模式确实提供了这些机会,浏览器将会实现这些机会 – 不pipe提供这些机会是否是ECMA委员会的有意目标。 但是,我不希望所有这些机会立即被采取。 在很多情况下,口头禅很可能是正确的,后来的performance,因为严格的模式现在还没有被广泛使用。 (我在Mozilla的JavaScript引擎上工作,并且已经实现了严格模式的各个部分,并且我们通常以这种方式实现 – 尽pipe如果我尝试,我可能会想到一个例外或两个)。
严格的模式并不是真正的性能,它是语言的一个严格的变体 ,它的主要目标是避免被认为是容易出错的特性 。
基本上它的目标是使语言更安全 ,引入了大量的语义变化,也进行了额外的错误检查,错误是嘈杂的,在非严格的代码中,只是默默地失败。
关于性能,我觉得现在浏览器厂商现在很难实现严格的模式,问题在于JS引擎大多是基于ECMAScript 3的,而实现严格模式并不容易,因为严格的范围是非常灵活的,你可以混合非严格和严格的代码。
也可以看看:
- ECMAScript 5严格模式,JSON等
- SpiderMonkey严格模式票
- Webkit严格模式票
根据这个testing“严格模式” 可以快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>
这可以在这里testing: 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>
这是jsPerftesting: http ://jsperf.com/strict-mode-arguments
大多数情况下, 没有 。 如果仔细检查ECMAScript 5标准文档,您会注意到在伪代码algorithm中几乎所有的严格模式都是:
if (isStrictMode) { //throw an (early) SyntaxError or TypeError } else { //return }
有两点需要注意:
- 严格模式的检查在ECMAScript 3中不存在。虽然相对轻量级,但与ECMAScript 3相比,符合JavaScript的实现现在至less运行一个额外的条件检查。 是啊…我知道像这样的一个单一的检查烧几个时钟周期,但小事加起来
- 由于严格模式主要是JavaScript的parsing时间function,因此对于某些网站(例如SunSpider)启用严格模式时,您最喜爱的浏览器不会显示性能下降。 也就是说,性能降低发生在代码被执行之前,这意味着最终用户可以感觉到它,但是使用Date对象来衡量块的执行时间在很大程度上是不可测量的