gpt4 book ai didi

javascript - 从不运行的线路是否会影响 V8 的性能?

转载 作者:行者123 更新时间:2023-12-04 02:27:38 37 4
gpt4 key购买 nike

我想知道这两个代码运行速度不同的原因。

快速.js

var N = 2e9;
(function () {
console.time();
var count = 0;
for (var i = 0; i < N; i++) count++;
if(false) console.log(count);
console.timeEnd()
})();

慢速

var N = 2e9;
(function () {
console.time();
var count = 0;
for (var i = 0; i < N; i++) count++;
if(false) (() => console.log(count));
console.timeEnd()
})();

执行

% node fast.js 
default: 1.297s
% node slow.js
default: 3.175s

代码之间的区别在于第 6 行。

if(false) console.log(count);

if(false) (() => console.log(count));

但是这些部分永远不会运行,因为它是死代码。

@tkihira分析并得出结论,变量 count 分配在堆中,因为它在 slow.js 运行时用于闭包,因此在 for 循环中需要更多时间来增加它。而 fast.js 中的 count 是在寄存器中。

这造成了速度差异。

有谁知道V8中的哪一部分代码?造成这种行为?当一个数字变量在一个从不运行的闭包中使用时,它是在堆中分配的,而当它不在闭包中使用时,它是在一个寄存器中,这是真的吗?

分析 @tkihira :源代码:https://gist.github.com/tkihira/b9c7fe8c31e21f1022011e377f7e672d

jit 输出:https://gist.github.com/tkihira/67a07231cc6a4ce55462d8cdfa51a6e2

差异:https://gist.github.com/tkihira/5f5877cde581c66cae3bc02f88e505e4

推特主题:https://twitter.com/tkihira/status/1365280241195782149

最佳答案

(此处为 V8 开发人员。)

Does anyone know which part of the code in V8 makes this behavior?

它是“范围解析”系统的一部分,大部分代码在src/ast/scopes.cc 中。 (它相当复杂,因为它要处理的事情太多了。)

Is it true that a number variable is allocated in heap when it's used in a closure that never runs and a variable and it's in a register when it's not used in a closure?

是的。

变量是否包含数字或其他任何内容都没有关系。

闭包运行的频率并不重要,包括它是否会运行。在需要决定在何处分配变量时,尚无关于将执行或不执行的信息。 (此外,静态保证永远不会执行的闭包在实际代码中非常罕见,即使可能,也很可能不值得对其进行优化。)

闭包使用的变量是“上下文分配的”,这使得访问它们比“堆栈分配的”变量慢一点。如果/当相关函数得到优化时,堆栈分配的变量可能会或可能不会最终保留在寄存器中,这取决于优化编译器做出的其他寄存器分配决策。

在大多数现实世界的情况下,您不会注意到差异(因此这通常不值得担心),但是像只执行 count++ 的循环这样的微基准测试使其可以观察到。

关于javascript - 从不运行的线路是否会影响 V8 的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66403844/

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