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

Posted

技术标签:

【中文标题】v8 是不是能够根据 `const` 的值消除死代码?【英文标题】:Is v8 capable of dead code elimination, based on the value of the `const`?v8 是否能够根据 `const` 的值消除死代码? 【发布时间】:2020-05-27 15:43:49 【问题描述】:

v8 开发人员/专家的问题。

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

module1.js

export const DEBUG = false

module2.js

import  DEBUG  from './module1.js'

if (DEBUG) 
    // dead code eliminated?

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

谢谢!

【问题讨论】:

【参考方案1】:

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

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

也就是说,在您发布的特定示例中,***代码不会得到优化(可能 - 取决于那里的其他内容),所以在这种情况下不会,if (DEBUG) 检查将被编译(到未优化的字节码)并执行——一次,因为执行一次比第一次尝试优化(并可能消除)它要快得多。

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

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

【讨论】:

感谢您的详细解答!

以上是关于v8 是不是能够根据 `const` 的值消除死代码?的主要内容,如果未能解决你的问题,请参考以下文章

c语言中const 是啥意思?

Microsoft 的强制隐式交集运算符是不是在 Excel VBA 中消除了我的公式?

const vs readonly

现代 C++ 编译器是不是能够避免在某些情况下两次调用 const 函数?

从V8源码分析一个JS 数组的内存占用问题

C语言中const有什么用途