簡體   English   中英

C#函數正常返回值VS out或ref參數

[英]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處理器上用於傳遞各種類型參數的堆棧空間量:

  • 字節:4個字節
  • bool:4個字節
  • 枚舉:4個字節
  • char:4個字節
  • 短:4個字節
  • int:4個字節
  • long:8個字節
  • float:4個字節
  • double:8個字節
  • 十進制:16個字節
  • struct:結構的運行時大小

  • string:4個字節
  • 數組:4個字節
  • 對象:4個字節
  • 接口:4個字節
  • 指針:4個字節
  • 類實例:4個字節

該行下面的參考類型,它們的大小將在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM