我们对 JS 中的箭头函数优化有任何保证吗?

Do we have any guarantees about arrow functions optimization in JS?

假设我们有下一个函数:

const x = a => a;
const result = x('hello')

我们在 Google V8 / Firefox Quantum 中是否有任何保证 x 将优化为 const result = 'hello'

我为什么要问这个?

请看我的answer。有时在 TypeScript 中推断类型的唯一方法是创建简单的函数。


type Validation<T> = T
const x = <T>(arg:Validation<T>)=>arg

这是开销。所以,我很好奇,我可以使用这种技术进行类型推断而不用担心函数开销吗?

(此处为 V8 开发人员。)

一般来说:没有保证可以优化或不优化的内容。引擎的优化决策也会随着时间而改变:目标不是尽可能地优化(因为优化本身并不总是值得的);目标是在正确的时间优化正确的事情。这很可能意味着工程团队决定减少他们的引擎优化,以获得更好的整体性能(或减少卡顿,或减少内存消耗,或其他)。

在这种特定情况下可能会发生什么:视情况而定(和往常一样)。如果那个函数的定义和它的调用点是顶级代码(执行一次),它很可能得不到优化——因为优化这样的代码通常是不值得的。您将无法衡量差异,但如果您能够衡量差异,您会发现对于只运行一次的代码,不优化会更快。
另一方面,如果这个恒等函数是从“热”代码调用的,而热代码本身在一段时间后被选择进行优化,那么优化编译器很可能会内联该函数,然后(平凡地)优化它走了。
如果恒等函数的定义被重复执行,那么(至少before/unless内联发生)这将不必要地创建多个函数对象(因为JavaScript函数有对象身份)。这是一种很容易避免的低效率(所以我个人会避免它);但同样:它是否真的重要,即它是否具有可衡量的效果,取决于代码执行的频率。

简而言之:在这种情况下不用担心函数开销可能没问题;但是,不能保证对身份函数的调用会得到优化。

(退后一步,看看更广泛的背景:我对 TypeScript 的高级功能了解不多,但我的直觉是,TS 编译器的某种插件可能是一种更优雅的强制执行方式文字的特定类型检查。如果字符串是在运行时构造的,那么 TS 的检查无论如何都无济于事,就像 TS 的类型检查系统的其余部分一样。)