亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Javascript (V8) 是否優化了未使用的返回值

Javascript (V8) 是否優化了未使用的返回值

30秒到達戰場 2022-09-02 17:02:11
假設我們有一個這樣的函數:function foo() {  // do some work...  return () => {}; // foo returns a function}客戶端代碼可以在兩種情況下使用:foo使用函數的結果const result = foo();// some code that uses result...忽略函數的結果foo();我想知道運行時(我不想引用語言本身,因為它很可能是依賴于實現的)是否會優化第1rst情況,所以我不必像這樣自己做:function foo(needTheResultValue = false) {  // do some work...  if (needTheResultValue) return () => {};  // nothing is returned if the caller didn't ask for it}
查看完整描述

1 回答

?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

V8 開發人員在這里。簡短的回答是“視情況而定,不要擔心”。


一般來說,據我所知,V8(和其他引擎)會根據每個功能進行優化。因此,在您的示例中,如果優化了,則不知道其返回值是將被使用還是被忽略,因此它無法對其進行優化。foo


例外情況是內聯:優化編譯器能夠在優化調用函數時內聯調用函數,例如在此示例中:


function foo() {

  // Do some FOO work...

  return {};

}

function bar() {

  foo();

  // Do some BAR work...

}

優化后,它將(繼續)返回一個新分配的空對象,無論它從何處調用。當被優化時,編譯器可能會決定內聯,并且在該步驟之后,它會看到(它自己的假設函數的內部表示,例如):foobarfoo


function bar() {

  // Do some FOO work...

  {};

  // Do some BAR work...

}

然后,它可以很容易地將未使用的對象分配放在那里。


也就是說,正如對這個問題的評論所指出的那樣,這不是你需要擔心的事情。(除非你碰巧不必要地花費大量時間來構建昂貴但未使用的返回值 - 但這似乎不太可能,因為這是一個相當明顯的低效率,所以你很可能不會首先編寫這樣的代碼。


特別是,與不返回任何內容相比,返回您計算的某個值的成本為零,因為每個函數總是返回一些東西 - 如果它沒有語句,那么引擎將悄悄地為您插入一個。這意味著并且將編譯為完全相同的代碼。如果你決定寫這樣的東西:returnreturn undefined;function f1() {}function f2() { return undefined; }


function overly_clever(need_result) {

  let result = do_some_work();

  if (result < 0) handle_error();


  if (need_result) {

    return result;

  } else {

    // Return nothing.

  }

}

那么這個函數會比你用一個簡單的替換空行后面的所有內容稍微慢(不可測量),因為“空”-branch(自動插入)并不比 快,所以評估條件是浪費時間。return resultelsereturn undefined;return resultneed_result


所以,簡而言之:不要擔心它。編寫有意義的代碼,讓引擎負責優化它。


(為了完整性:如果你確實覺得需要進行手動優化工作,請通過測量來指導它:分析你的應用以查看花費最多時間的位置,并測量任何嘗試更改的效果以查看它們是否有效。不要使用微基準標記,因為它們往往會產生誤導。


查看完整回答
反對 回復 2022-09-02
  • 1 回答
  • 0 關注
  • 95 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號