2015-10-06 89 views
4

假設我們有兩個函數,它們返回一個大對象。一個直接返回數據,另一個將它分配給一個內部變量並返回這個變量。有沒有人知道堆內存是否會在分配和性能方面有所不同,以及爲什麼?瀏覽器引擎是否會優化代碼,所以最終可能會是相同的?從函數返回內部變量還是直接返回值有差別

function foo() { 
    return getSmth(); 
} 

function foo() { 
    var bar = getSmth(); 
    return bar; 
} 
+0

您可以在http://jsperf.com/functions-heap-size中進行速度測試。 (這不是堆大小測試) –

回答

3

堆分配幾乎是一樣的。在第二個示例中,假設沒有優化,如果內部函數的返回值是一個對象,那麼您正在複製對bar的額外引用。如果返回值是一個原始類型,那麼你正在複製用來保存該值的字節數。在任何一種情況下,額外的引用/值都會被丟棄,並且在不太可能的情況下,它被存儲在堆中可用於垃圾收集。

可能是這樣的情況,JavaScript引擎在編譯期間會優化bar變量。

+0

在非引用類型的情況下,例如原始字符串?然而,[這個答案建議](http://stackoverflow.com/a/1308668/1481489)'bar'將簡單地指向'getSmth'的結果,而不是被複制到內存中。 – zamnuts

+0

@zamnuts:它絕對不會被複制(JavaScript sans優化是100%引用語義,並且優化不會爲了好玩而進行復制)。唯一的問題是它是否(無意義地)將一個本地引用存儲到「堆棧」等價物中,然後加載它並將其返回,或者它是否直接返回。我懷疑大多數優化JS引擎將直接返回,但即使他們這樣做,我個人更喜歡不是毫無意義地創建指定的變量;只是直接'返回'而不是浪費代碼行,無論如何無助於可讀性。 – ShadowRanger