簡體   English   中英

我們對 JS 中的箭頭函數優化有什么保證嗎?

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

假設我們有下一個 function:

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

我們是否在 Google V8 / Firefox Quantum 中保證x將優化為const result = 'hello'

為什么我要問它?

請看我的回答 有時,在 TypeScript 中推斷類型的唯一方法是制作簡單的 function。


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

這是一個開銷。 所以,我很好奇,我可以使用這種技術進行類型推斷並且不用擔心 function 開銷嗎?

(這里是 V8 開發人員。)

一般來說:不能保證什么會或不會得到優化。 引擎的優化決策也會隨着時間而改變:目標不是盡可能地優化(因為優化本身的成本並不總是值得的); 目標是在正確的時間優化正確的事情。 這很可能意味着工程團隊決定讓他們的引擎優化得更少,以獲得更好的整體性能(或更少的抖動,或更少的 memory 消耗,或其他)。

在這種特定情況下可能會發生什么:這取決於(像往常一樣)。 如果該函數的定義及其調用站點是頂級代碼(執行一次),它很可能不會得到優化——因為優化這樣的代碼通常是不值得的。 您將無法衡量差異,但如果您能夠衡量差異,您會發現對於只運行一次的代碼來說,不進行優化會更快。
另一方面,如果這個標識 function 是從“熱”代碼中調用的,而該熱代碼本身會在一段時間后被選擇進行優化,那么優化編譯器很可能會內聯 function,然后(平凡地)優化它離開。
If the definition of the identity function is executed repeatedly, then (at least before/unless inlining happens) this will unnecessarily create several function objects (because JavaScript functions have object identity). 這是一種很容易避免的低效率(所以我個人會避免它); 但同樣:它是否真的重要,即它是否具有可衡量的效果,取決於代碼執行的頻率。

簡而言之:在這種情況下,不用擔心 function 開銷可能沒問題; 但是,不能保證對身份 function 的調用將得到優化。

(退后一步,看看更廣泛的背景:我對 TypeScript 的高級功能知之甚少,但我的直覺是 TS 編譯器的某種插件可能是一種更優雅的方式來強制對文字進行特定類型檢查。如果字符串是在運行時構造的,那么 TS 的檢查無論如何都無濟於事,就像 TS 的類型檢查系統的 rest 一樣。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM