2012-02-17 83 views
10

在C#中,將DateTime引用作爲參數傳遞給函數時,是否有任何顯着的內存分配減少,而不是按值傳遞?可以通過在c#中引用DateTime參數來減少內存分配嗎?

int GetDayNumber(ref DateTime date) 

VS

int GetDayNumber(DateTime date) 

函數內的代碼不修改在任何情況下的日期。

+1

任何你不會使用'date.Day'的理由? – 2012-02-17 11:19:43

+0

有多重要? DateTime對象不完全是內存管理器。它最有可能在堆棧或寄存器中,甚至當你傳遞一個引用時,你仍然傳遞的數據(即引用)可能是相同的大小(它不能小得多,因爲DateTime很小)。 – 2012-02-17 11:21:57

+0

這個函數的功能與日期不同。日期 這個函數被調用了幾百萬次,所以它的任何改進都會很棒。我想那麼,在堆棧內存分配的差異是「日期時間大小」 - 「參考大小」 – jeroko 2012-02-17 11:28:49

回答

12

A DateTime是一個8字節的結構。 A ref具有4或8個字節,具體取決於您的目標架構。所以最好你會節省4個字節的堆棧內存,這是完全不相關的。

ref甚至可能會阻止某些優化,例如將DateTime放入寄存器,從而實際增加內存使用量。

這是一個明顯的過早優化案例。不要這樣做。

+0

如果該方法連續被稱爲百萬次,該怎麼辦?這取決於什麼時候爲GC解釋了參考。如果它是短命的,那麼可以,但如果它持續了一個不可忽視的時間,那麼參考文獻是否會產生積極的影響呢? – 2012-02-17 11:37:37

+1

1)連續100萬次根本沒有效果。你會得到相同的8個字節一百萬次。遞歸一百萬次會是一個問題,但在C#中很少有深度遞歸函數。 2)GC不會進入這個。分配在堆棧上的本地'DateTime'不需要釋放GC。當函數退出時,堆棧指針被調整,並且所有真正的局部變量都消失了。這實際上是免費的。 |如果你的局部變量不是真正的局部變量(lamda capture,async-await,yield iteratiors,...),那麼它就變得複雜了,但是在這裏並不是這樣。 – CodesInChaos 2012-02-17 11:42:31

1

我不認爲有任何顯着的內存使用減少,但我相信有一些。

當傳遞的日期時間與裁判也不會有創建了一個新的datetime對象,當你不使用ref關鍵字

-2

內部,DateTime值表示爲蜱的數量,這是一個長期的的64位。

64位處理器將需要相同數量的位來發送變量的地址。

但是,如果在32位處理器中工作,您的地址範圍小於日期時間的大小。所以性能可以提高。

但是,在實踐中,差異幾乎不會被注意到。

+0

這是錯誤的,它通過值**傳遞**。即使它是一個引用類型,它不是,它仍然會被傳遞。 – oleksii 2012-02-17 11:23:55

+1

DateTime是一個結構,所以不通過引用傳遞 - 除非有人在沒有告訴我的情況下更改C#? – 2012-02-17 11:24:02

+2

你是不正確的,DateTime是一個結構,因此通過值傳遞。 – 2012-02-17 11:24:31

2

與其他類似的問題一樣,您需要自己計算時間。幾個處理器會發揮重要作用嗎?在你的應用程序中,多少字節會佔用內存消耗的主要部分?

離開微觀優化,首先專注於真正的問題解決。

0

您可以,但是因爲DateTime是一個結構體並且只在堆棧上分配,所以開銷很小,因爲沒有類的堆分配。另外,因爲該值是作爲新實例傳遞的,所以只要離開該方法,堆棧中的空間就會被釋放。

var date = DateTime.Today; // One date time object is allocated and assigned to the stack. 
DoSomething(date); // this will result in a second date time object being allocated and assigned to the stack. 

private void DoSomething(DateTime date) 
{ 
    // do something with the date time object. 
} // As soon as we leave this method, the date time object is removed from the stack as it is now out of scope. 
+2

這不是釋放堆棧中的結構的GC。這些只是通過調整函數末尾的堆棧指針來「釋放」,所以它們現在處於堆棧的未使用部分。 – CodesInChaos 2012-02-17 11:31:32

+0

好點,我會更新我的回答以反映。 – 2012-02-17 11:34:54