为什么封装的Javascript函数有如此巨大的性能差异
Why this huge performance difference for an encapsulated Javascript function?
所以我有一个简单的代码:
function Run () {
var n = 2*1e7;
var inside = 0;
while (n--) {
if (Math.pow(Math.random(), 2) +
Math.pow(Math.random(), 2) < 1)
inside++;
}
return inside;
}
var start = Date.now();
Run();
console.log(Date.now() - start);
它将在335ms左右输出一段时间。真不错。但是,如果我这样封装Run函数:
var d = Date.now();
(function Run () {
var n = 2*1e7;
var inside = 0;
while (n--) {
if (Math.pow(Math.random(), 2) +
Math.pow(Math.random(), 2) < 1)
inside++;
}
return inside;
})();
console.log(Date.now() - d);
它将输出18319ms,这比以前的情况差得多。为什么会这样?
此外,如果重要的话,我在控制台的Chrome 26.0.1410.63上运行它。在node.js上,这两个代码段在控制台上都表现良好。
函数分离和函数表达式WRT对优化没有区别,这太荒谬了。
Google Chrome中的控制台代码封装在with
语句中,如下所示:
with ((console && console._commandLineAPI) || {}) {
//Your code is concatenated here
}
因为函数声明是挂起的,所以前一个代码实际上是这样的:
function Run () {
var n = 2*1e7;
var inside = 0;
while (n--) {
if (Math.pow(Math.random(), 2) +
Math.pow(Math.random(), 2) < 1)
inside++;
}
return inside;
}
with ((console && console._commandLineAPI) || {}) {
var start = Date.now();
Run();
console.log(Date.now() - start);
}
因此,声明在with
语句外运行。事实上,在块中有函数声明是无效的语法,函数声明只能是顶级语句。
因此,无论如何,由于历史原因,V8很好,并将其提升,而不是抛出语法错误:
var i = 3;
with({i:4}) {
function test() {
console.log(i);
}
}
test();//logs 3 so it is obviously **not** under `with` influence
因此,因为声明不在with
语句下,所以它将运行得更快。With语句在V8下是不可优化的,它还破坏了词法范围。
*不可优化意味着优化编译器不会查看代码,而只有通用编译器会为函数生成代码。它与firefox的解释器与JIT模式相当。如果您想了解更多关于V8中哪些语言功能禁用优化的信息,请阅读优化杀手
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- 提高JQuery的性能
- 使用正则表达式评估电子邮件地址时出现性能问题
- React:按键的性能提升
- 在Three.js中导出网格会提高性能吗
- 巨大的数据和PHP错误
- 在javascript中搜索项目列表的性能
- 对于加载时间过长的循环来说是巨大的
- 为什么在许多浏览器中drawImage()的性能略好于createPattern()
- JavaScript数组优化以提高性能
- React+Redux性能优化与组件ShouldUpdate
- 在循环中附加事件处理程序时出现浏览器性能问题
- JavaScript-===vs===运算符性能
- D3 Javascript可视化巨大XML文件的性能
- 为什么封装的Javascript函数有如此巨大的性能差异
- 循环在性能测量中产生了巨大的差异
- 抓取页面上的所有 URL 进行更改会导致巨大的性能下降
- 为什么 DOM 读/写操作的微小重新排序会导致巨大的性能差异
- 同时淡出许多(大约20个)道具,导致巨大的性能损失.解决方案
- 为什么复杂循环和多循环之间会有如此巨大的性能差异?