一般而言,在“严格模式”下在浏览器中执行javascript是否会提高性能?是否有任何主流浏览器都进行了其他优化或使用了其他技术来提高严格模式下的性能?
稍微改一下,严格模式是否旨在(除其他目标外)允许浏览器引入其他优化或其他性能增强功能?
一般而言,在“严格模式”下在浏览器中执行javascript是否会提高性能?是否有任何主流浏览器都进行了其他优化或使用了其他技术来提高严格模式下的性能?
稍微改一下,严格模式是否旨在(除其他目标外)允许浏览器引入其他优化或其他性能增强功能?
with
关键字不仅效果不佳,而且仅在语言中使用也会使整个语言变慢。CMS答案中的此链接表示,该with
关键字在严格模式下不起作用,因此,这似乎至少表明有可能提速。
Answers:
除其他目标外,严格模式是否旨在允许浏览器引入其他优化或其他性能增强功能?
不管是不是有人打算这样做,我不知道,但我想答案是肯定的。
但是我可以肯定地说,严格模式确实提供了这些机会,而浏览器会实现这些机会-不管提供这些机会是否是ECMA委员会的故意目标。但是,我不希望所有这些机会会立即被抓住。在许多情况下,该咒语可能首先是正确的,然后是性能,因为严格的模式目前尚未广泛使用。(我在Mozilla的JavaScript引擎上工作,并已实现严格模式的各个部分,我们通常以这种方式来实现它-尽管我尝试过可能会想到一两个异常。
在严格的模式是不是真正的性能,它严格变种的语言,它的主要目标是避免了被认为是容易出错的功能。
基本上,它的目标是使语言更安全,引入很多语义上的更改,还进行附加的错误检查,并且错误很嘈杂,在非严格代码中,事物只会默默地失败。
关于性能,我认为浏览器供应商现在很难实施严格模式,问题在于JS引擎主要基于ECMAScript 3,并且实施严格模式并不容易,因为严格的范围非常灵活,您可以混合使用非严格代码和严格代码。
也可以看看:
strict
模式的另一个好处是,如果一个函数声明了一个局部变量foo
并且没有定义任何捕获它的嵌套函数,则它将foo
在第一次读取之前将一个数字存储到,而从不将数字以外的任何东西存储到中foo
,调用函数(或其他任何函数)不可能导致foo
保留数字以外的任何东西。确定上述条件成立很容易,并且使用数字的处理比使用碰巧是数字的多态对象的处理要容易得多。
根据此测试,“严格模式”可以快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
<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
在大多数情况下,不。如果仔细查看ECMAScript 5标准文档,您会发现伪代码算法中几乎所有严格模式的出现都等于:
if (isStrictMode) {
//throw an (early) SyntaxError or TypeError
}
else {
//return
}
有两件事要注意: