v8开发人员/专家的问题。
假设 v8 将完全消除死代码是否正确,结构如下:
模块1.js
export const DEBUG = false
模块2.js
import { DEBUG } from './module1.js'
if (DEBUG) {
// dead code eliminated?
}
请不要发表这样的评论 - "'如果'检查的开销非常小,你应该 XXX 而不是问这个问题",我只想知道 v8 是否能够做到这一点(是/否,当然最好有一点细节(。
谢谢!
这里的V8 开发人员。答案是,一如既往,"视情况而定"。
V8 的优化编译器支持死代码消除,所以是的,在适当的情况下,永远无法采用的条件分支将被消除。
也就是说,在您发布的具体示例中,顶级代码不会得到优化(可能 - 取决于其中的其他内容(,因此在这种情况下,没有,if (DEBUG)
检查将被编译(到未优化的字节码(并执行 - 一次,因为执行一次比第一次尝试优化(并可能消除(它要快得多。
另一件需要考虑的事情是 V8 "懒惰地"编译函数,即按需编译。这意味着如果你有一个永远不会被调用的整个函数(例如,因为它唯一的调用站点位于if (DEBUG)
块中,并且DEBUG
是false
(,那么该函数甚至不会被编译为字节码,更不用说优化的代码了。这不是该术语传统意义上的死代码消除,但可以说它更好:-(
总之:如果你在你的应用程序上撒了一点DEBUG
代码,那么把它留在里面是完全可以的。要么它位于很少执行的路径中,在这种情况下,执行检查的成本无关紧要;或者它将位于热路径中,在这种情况下,V8 将对其进行优化并消除条件。但是,如果您有很多这样的代码,那么删除它将有两个优点:下载大小和解析时间。当 JavaScript 代码到达浏览器时,引擎别无选择,只能至少简单地查看它的每一个字节(如果只是为了弄清楚有哪些函数,以及代码的哪些部分在顶层并且必须立即执行(,并且字节越少,该步骤完成得越快。解析速度很快,但解析一半甚至更快!