2015-10-06 93 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