這些方法中的任何一個比其他方法使用更多的內存還是將更大的負載放在GC上?.NET內存消耗問題
選項#1
LargeObject GetObject()
{
return new LargeObject();
}
選項#兩種方法2
LargeObject GetObject()
{
LargeObject result = new LargeObject();
return result;
}
這些方法中的任何一個比其他方法使用更多的內存還是將更大的負載放在GC上?.NET內存消耗問題
選項#1
LargeObject GetObject()
{
return new LargeObject();
}
選項#兩種方法2
LargeObject GetObject()
{
LargeObject result = new LargeObject();
return result;
}
編譯器將生成等效於代碼版本2的IL,需要虛擬堆棧位置來存儲對象引用。 JIT優化器將生成等價於代碼版本1的機器代碼,該引用存儲在CPU寄存器中。
換句話說,沒關係。您在運行時獲得完全相同的機器碼。
堆內存使用是相等的。在第二種情況下創建局部變量的開銷很小,但它不應該打擾你。變量將被存儲在堆棧中,不會對GC產生額外的壓力。此外,這個附加變量可能會被編譯器或JIT優化(所以它可能不會出現在實際由CLR執行的代碼中)。
你可以看看生成的IL(使用反射鏡),看看它是否不同的。根據編譯優化設置,#2可能會在堆棧上存儲一個額外的值(對於result
值),但這隻會是額外的4或8個字節(如果它是一個類,它應該是!),並且會根本不影響GC。
IL雖然不是編譯好的代碼。這只是一箇中間步驟。 – 2010-10-28 17:00:55
是的,但如果IL是相同的,那麼代碼將完全相同。 – thecoop 2010-10-29 08:37:14
在發佈模式下生成的代碼不會有任何區別。 JIT編譯器幾乎肯定會刪除不必要的臨時變量。 – 2010-10-28 15:44:24