1

假設我們在實現文件處理的對象中。我想編寫代碼以便於閱讀。的代碼當從函數調用返回值時,最新的JavaScript/ECMAScripte編譯器是否優化了不必要的變量賦值?

實施例,其中它可以是難以分辨的返回類型,尤其是當有多個嵌套函數調用:

function create() { 
    return doCreateAction(); 
} 

該實施例是通過將澄清變量更易讀:

function create() { 
    var fileHandle = doCreateAction(); 
    return fileHandle; 
} 

理論上,第二個版本可以執行相同的操作,因爲編譯器必須暫時存儲來自doCreateAction()的結果(可能在某個隱藏的,匿名的,短暫的臨時變量中)。分配給一個命名變量時,這個代碼是否更慢?

+1

「分配給一個指定變量時,這個代碼是否更慢?」你有沒有試圖自己做一些基準測試?無關。我會說你最好重命名你的函數:)爲什麼'doCreateAction'返回的東西更好地描述爲'fileHandle'?你爲什麼不把它叫做'createFileHandle'什麼的。 –

+1

在這樣一個顯而易見的情況下?如果他們不這樣做,我會非常驚訝。我知道這是事實嗎?不,我沒有檢查所有主要JavaScript引擎的優化器代碼(更不用說它們的所有變體;例如,V8目前使用解釋器和編譯器,直到最近它使用兩個編譯器)。 –

+0

你想知道這....爲什麼? – 2017-07-26 11:06:32

回答

1

我會說他們要麼優化變量,要麼不值得打擾;而且無論哪種情況你都有更大的魚來炒。 :-)但是在尾部調用方面有一個有趣的方面。

但是,首先,就簡單的性能而言:在經驗上,this simplistic, synthetic test表明函數的性能不會根據是否有變量而變化。另外請注意,如果您使用了一個體面的縮小器,縮小器可能會在JavaScript引擎查看之前爲您刪除該變量。

移動到尾電話:正如你可能已經知道,ES2015的嚴格模式specificaton需要尾調用優化,這意味着當函數的返回調用函數B,而不是B的結果將結果返回給A,然後將它返回給調用者,A將控件直接傳遞給B,然後將結果返回給調用者。這在幾個方面更有效率(避免在棧上創建另一個框架,避免跳轉)。

JavaScript引擎仍在致力於其TCO實施。 (例如,按照V8的進度here。)但是,如果我的read the spec正確(無意義的壯舉),則您的第一個示例在尾部位置有doCreateAction,因此可以通過TCO進行優化,但第二個示例沒有。目前在Node8.2.1(v5.8.283.41)中的V8中的TCO確實優化了第一個,而不是第二個。

因此,在這方面可能存在一些影響,具體取決於一旦發動機是否按照規定實施了TCO,它們超出了這種情況的規格,明顯是這樣的情況,實際上是尾部呼叫。


我曾經是相當嚴格的有關在這種情況下用於調試目的使用的變量;中等最新版本的Chrome開發工具使得不需要使用的用途(當然,還有一個縮小器會將其刪除):如果步入return,您會看到本地變量範圍列表中的返回值。當然,這隻有在你使用Chrome的開發工具時纔有用(例如,Firefox就不這麼做了)。

相關問題