javascript - v8 是否能够根据 `const` 的值消除死代码?

标签 javascript performance v8 dead-code code-elimination

v8 开发者/专家的问题。

假设 v8 将完全消除死代码是否正确,结构如下:

module1.js

export const DEBUG = false

module2.js

import { DEBUG } from './module1.js'

if (DEBUG) {
    // dead code eliminated?
}

请不要评论 - “'if' 检查的开销非常小,你应该 XXX 而不是问这个问题”,我只是想知道 v8 是否能够做到这一点(是/否,最好有一点当然是细节)。

谢谢!

最佳答案

这里是 V8 开发人员。答案通常是“视情况而定”。

V8 的优化编译器支持死代码消除,所以是的,在适当的情况下,永远不会被采用的条件分支将被消除。

就是说,在您发布的具体示例中,顶级代码不会得到优化(可能——取决于那里还有什么),所以在那种情况下,if (DEBUG) check 将被编译(到未优化的字节码)并执行一次——一次,因为执行一次比第一次尝试优化(并可能消除)它要快得多。

另一件需要考虑的事情是,V8 会“懒惰地”编译函数,即按需编译。这意味着如果你有一个永远不会被调用的完整函数(例如,因为它唯一的调用点在 if (DEBUG) block 中并且 DEBUGfalse),那么该函数甚至不会被编译为字节码,更不用说优化代码了。这不是传统意义上的死代码消除,但可以说它更好:-)

总而言之:如果您在您的应用程序中散布了一些DEBUG代码,那么将其保留在里面是完全可以的。它要么位于很少执行的路径中,在这种情况下成本执行检查无关紧要;或者它将处于热路径中,在这种情况下,V8 将对其进行优化并消除条件。但是,如果您有很多 此类代码,那么删除它会有两个好处:下载大小和解析时间。当 JavaScript 代码到达浏览器时,引擎别无选择,只能至少简要地查看它的每个字节(如果只是为了弄清楚有哪些函数,代码的哪些部分在顶层并且必须立即执行),并且字节越少,该步骤完成得越快。解析速度很快,但解析一半更快!

关于javascript - v8 是否能够根据 `const` 的值消除死代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62047178/

相关文章:

javascript - 使按钮自动点击

JavaScript 和 HTML5 - 朝鼠标方向旋转角色

javascript - 如何使用 JavaScript/jQuery 编辑 PHP 变量?

javascript - 如何理解 Web Audio API panner 节点的 "distance"方法之间的关系

javascript - 智能数学正则表达式

javascript - 在 v8 中声明具有未知值的(类)属性的最佳(性能最高)方法

java - 为什么复制/剪切/粘贴文件/文件夹后需要重启?

objective-c - 存储对象数组或在需要时创建?

javascript - "arguments"对象在内部是如何工作的?

javascript - 如何在标识符中使用 % 符号