[英]C# function normal return value VS out or ref argument
我在C#中有一個方法需要返回一個非常大的數組(或任何其他大數據結構)。
使用ref或out參數而不是標准返回值是否有性能提升?
IE在使用中有任何性能或其他收益
void function(sometype input, ref largearray)
過度
largearray function(sometype input)
32位x86處理器上用於傳遞各種類型參數的堆棧空間量:
該行下面的參考類型,它們的大小將在64位處理器上加倍。
對於靜態方法調用,最多4個字節的前2個參數將通過CPU寄存器傳遞,而不是堆棧。 對於實例方法調用,只有一個參數將通過寄存器傳遞。 其余的都在堆棧上傳遞。 64位處理器支持通過寄存器傳遞4個參數。
從列表中可以清楚地看出,你應該考慮通過ref傳遞參數的唯一時間是結構。 對此的正常指導是在結構大於16個字節時這樣做。 猜測結構的運行時大小並不總是容易的,通常最多4個字段是准確的。 如果這些字段是double,long或decimal,則減少。 因此,本指南通常建議將您的結構轉換為類,正是出於這個原因。
還要注意, 沒有節省將參數作為字節或短的故意傳遞,int是32位處理器滿意的類型。 對於當前可用的64位處理器也是如此。
方法返回值,問題的真實主題幾乎總是在CPU寄存器中返回。 大多數類型適合放在eax或edx:eax寄存器中,FPU寄存器用於浮點值。 唯一的例外是大結構和十進制,它們太大而不適合寄存器。 它們通過在堆棧上為返回值保留空間並將4字節指針傳遞給該空間作為方法的參數來調用。
out
參數返回對類型實例的引用,在發送到方法之前不需要對其進行初始化。
ref
參數返回對類型實例的引用, 必須在發送到方法之前對其進行初始化。
這是關於調用語義,而不是性能。
沒有,只需返回數組
兩者之間沒有區別
void function(sometype input, out largearray output )
過度
largearray function(sometype input)
但是,如果你這樣做
largearray function( sometype input, ref largearray output )
並且您需要調用者預先分配大數組,這當然會更快,但只有重復調用該方法並保持在調用之間分配大數組才有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.