gpt4 book ai didi

v8 和 SpiderMonkey 中的 Javascript var vs let(去)优化/减速问题

转载 作者:行者123 更新时间:2023-11-29 19:05:34 28 4
gpt4 key购买 nike

在我的项目中重构 JavaScript 代码期间,我发现我的一些循环速度急剧下降。寻找根本原因我发现了 this SO question声明减速是由 for 循环和闭包创建中的 let 语句引起的。令我惊讶的是,将 let 和闭包移出 for 循环并没有帮助,甚至使用 var 而不是 let for 循环变量也无济于事,因为减速是由 let 放置在 after for 循环引起的。通过删除额外的细节,我获得了这个代码片段:

"use strict"
console.log("=========================");
(function(){
var itr = 0;
function f(){++itr;}
console.time('without_let');
for(var i = 0; i < 50000000; ++i){
f();
}
var totals = 0;
console.timeEnd('without_let'); //chrome: 122ms, FF:102ms
})();

(function(){
var itr = 0;
function f(){++itr;}
console.time('let_below');
for(var i = 0; i < 50000000; ++i){
f();
}
let totals = 0; // <--- notice let instead of var
console.timeEnd('let_below'); //chrome: 411ms, FF:99ms
})();

(function(){
let itr = 0;
function f(){++itr;}
console.time('let_above_and_in_loop');
for(let i = 0; i < 50000000; ++i){
f();
}
var totals = 0;
console.timeEnd('let_above_and_in_loop'); //chrome: 153ms, FF:899ms
})();

(function(){
var itr = 0;
function f(){++itr;}
console.time('let_in_loop');
for(let i = 0; i < 50000000; ++i){
f();
}
var totals = 0;
console.timeEnd('let_in_loop'); //chrome: 137ms, FF:102ms
})();

(也在 JS Fiddle 注意:使用 JS Fiddle 显示的结果略有不同,但在相同的地方仍然存在类似的减速)

在 Chrome 上运行它会产生以下结果

 without_let: 122ms
let_below: 411ms <----------- Slowdown for v8
let_above_and_in_loop: 153ms
let_in_loop: 137ms

一些谷歌搜索把我带到了the article说明 let 在 Chrome 56/V8 5.6 之前导致去优化!但我的 chrome 是 57.0.2987.133(64 位)和 v8 版本 5.7.492.71。更多惊喜尝试在 Firefox 52.0.2(32 位)上运行。这里我们在另一个地方减速,当使用 let 创建的变量在闭包中使用时:

 without_let: 101.9ms
let_below: 99ms
let_above_and_in_loop: 899ms <----- Slowdown for SpiderMonkey
let_in_loop: 102ms

据我所知,这个问题与所谓的“临时死区”功能有些相关,但仍不清楚:

  1. 为什么两个主要浏览器(主要 JavaScript 引擎)仍然无法优化代码段的那些(不同)部分?

  2. 是否有任何解决方法可以继续使用 let(除了使用 Babel 将 let 转换为 var)?假设我能够通过 v8::V8::SetFlagsFromCommandLine(&argc, argv, true);

  3. 将选项传递给 Chrome,甚至直接传递给 v8

更新:在 Chrome 版本 58.0.3029.96 中,相应的 v8 版本 5.8.283.37(根据 https://omahaproxy.appspot.com/ )在启用 chrome://flags/#enable-v8-future 后,正如下面 jmrk 建议的那样,第三种情况仍然减速(现在是 2 次) 8 次)

without_let: 157.000ms
let_below: 155.000ms
let_above_and_in_loop: 304.000ms
let_in_loop: 201.000ms

火狐 53.0(32 位)

without_let: 278.650ms
let_below: 310.290ms
let_above_and_in_loop: 848.325ms
let_in_loop: 275.495ms

最佳答案

我可以回答问题的 V8 部分。您看到的减速是由于旧的优化编译器(称为“Crankshaft”)的限制。一直以来都没有解决这个问题,因为团队一直忙于开发新的优化编译器(“Turbofan”),它在 Chrome 59 中发布(目前在 Canary 和 Dev channel ,很快将在 Beta 版上发布!)。

在 Chrome 58(目前处于 Beta 阶段)中,您已经可以通过将“实验性 JavaScript 编译管道”设置为“已启用”来获得预览(位于 chrome://flags/#enable-v8-future)。请注意,Chrome 59 将有一些额外的性能改进。

旁注:在现有代码库中,迁移到 let 并没有太大好处,因此您可以继续使用 var

关于v8 和 SpiderMonkey 中的 Javascript var vs let(去)优化/减速问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43153889/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com