javascript - v8 是否能够根据 `const` 的值消除死代码?
问题描述
v8 开发人员/专家的问题。
假设 v8 将完全消除死代码是否正确,结构如下:
模块1.js
export const DEBUG = false
模块2.js
import { DEBUG } from './module1.js'
if (DEBUG) {
// dead code eliminated?
}
请不要发表评论,例如“'if'检查的开销非常小,您应该 XXX 而不是问这个问题”,我只想知道 v8 是否能够做到这一点(是/否,当然最好有一些细节)。
谢谢!
解决方案
V8 开发人员在这里。答案通常是“视情况而定”。
V8 的优化编译器支持死代码消除,所以是的,在适当的情况下,永远无法采用的条件分支将被消除。
也就是说,在您发布的特定示例中,顶级代码不会得到优化(可能 - 取决于那里的其他内容),所以在这种情况下不,if (DEBUG)
检查将被编译(未优化的字节码)和执行——一次,因为执行一次比第一次尝试优化(并可能消除)它要快得多。
要考虑的另一件事是 V8 会“延迟”编译函数,即按需编译。这意味着如果你有一个永远不会被调用的整个函数(例如,因为它唯一的调用站点在if (DEBUG)
-block 中并且DEBUG
is false
),那么该函数甚至不会被编译为字节码,更不用说优化代码了。这不是该术语的传统含义中的死代码消除,但可以说它更好:-)
结论:如果你DEBUG
的应用程序上洒了一点 -code,把它留在里面是完全可以的。要么它会在很少执行的路径中,在这种情况下,执行检查的成本无关紧要;否则它将处于热门路径,在这种情况下,V8 将对其进行优化并消除条件。但是,如果你有很多这样的代码,那么删除它会有两个好处:下载大小和解析时间。当 JavaScript 代码到达浏览器时,引擎别无选择,只能至少简要地查看它的每个字节(如果只是为了弄清楚有哪些函数,以及代码的哪些部分在顶层并且必须立即执行),并且字节数越少,该步骤完成的越快。解析速度很快,但解析一半甚至更快!
推荐阅读
- javascript - 从 SelectBox 中获取值
- html - 帮助页脚html css
- mongodb - MongoDB 和 WiredTiger 兼容性问题
- macos - 为什么 Mac OS X (10.15.7) 上的联系人使用 CPU 的全部功能?
- swift - 如何在 iOS 中实现 alpha 渐变效果
- c - 为什么我的代码在 scanf 上运行良好,但在我使用 fgets 时显示输出差异?
- excel - 如何使用 Apache poi 库将 word、excel 文件嵌入到 ppt 文件中?
- android - 在 kotlin 的警报对话框中禁用积极按钮
- java - 何时以及如何在 flatMap 上执行 1 到 0..n 映射 Stream mapMulti
- r - 按日期集分组 data.table