2010-05-16 128 views
6

我有一个在C#中需要返回一个非常大的数组(或任何其他大数据结构)的方法。C#函数正常返回值VS输出或参考参数

使用ref或out参数代替标准返回值会有性能提升吗?

I.E.是有在使用

void function(sometype input, ref largearray) 

largearray function(sometype input) 
+0

我想你会感到困惑;你会返回一个大型数组的引用,而不是数组本身...... – 2010-05-16 07:28:00

+1

Stadard .Net数组已经是引用类型。 – Dykam 2010-05-16 08:14:54

回答

5

堆栈空间上的32位x86处理器中使用的量来传递不同类型的参数:

  • 字节:4个字节
  • 布尔:4个字节
  • 枚举:4个字节
  • 炭:4个字节
  • 短:4个字节
  • INT:4个字节
  • 长:8b的ytes
  • 浮动:4个字节
  • 双:8字节
  • 十进制:16个字节
  • 结构:4个字节
  • :结构

  • 串的运行时尺寸array:4 bytes
  • object:4 bytes
  • 接口:4个字节
  • 指针:4个字节
  • 类实例:4个字节

线下面的那些是参考的类型,它们的大小将加倍上的64位处理器。

对于静态方法调用,高达4个字节的前2个参数将通过CPU寄存器传递,而不是堆栈。对于一个实例方法来说,只有一个参数会通过寄存器传递。其余的都通过堆栈传递。 64位处理器支持通过寄存器传递4个参数。

从列表中可以清楚看出,唯一一次你应该考虑通过ref来传递参数的结构。正常的指导是当结构大于16字节时这样做。猜测结构的运行时间大小并不总是很容易,最多4个字段通常是准确的。如果这些字段是双精度,长精度或十进制精度则更少这个指导通常建议把你的结构变成一个班级,正是出于这个原因。

另请注意,有没有节省传递参数作为字节或有意识的短,int是32位处理器满意的类型。目前可用的64位处理器也一样。


方法返回值,你问题的真正主题几乎总是返回在CPU寄存器中。大多数类型都适合eax或edx:eax寄存器,一个浮点值的FPU寄存器。唯一的例外是大型结构和小数,它们太大而不适合寄存器。通过在堆栈中为返回值预留空间并将4字节指针传递给该空间作为该方法的参数来调用它们。

+0

这是我正在寻找的答案。我看不出如何标记这个答案 - 虽然我是一个新手,我也许会瞎了一点? – user335023 2010-05-17 11:50:16

1

一种out参数返回到类型的一个实例,其不要求发送到一个方法之前被初始化的参考任何性能或其他增益。

ref参数返回到类型的实例的引用,该必须发送到一个方法之前被初始化。

这是关于调用语义,而不是性能。

1

没有,只是返回数组

1

会有超过

largearray function(sometype input) 

但是,如果你这样做

largearray function(sometype input, ref largearray output) 

void function(sometype input, out largearray output) 

没有什么区别你需要e调用者预先分配了大数组,这当然会更快,但只有当您重复调用方法并在调用之间保持大数组分配时,它才会起作用。