2010-05-16 9 views
6

Tengo un método en C# que necesita devolver una matriz muy grande (o cualquier otra estructura de datos de gran tamaño para el caso).Función C# valor de retorno normal VS argumento de salida o ref

¿Hay una ganancia de rendimiento en el uso de un parámetro ref o out en lugar del valor de retorno estándar?

I.E. ¿hay alguna rendimiento u otra ganancia en el uso de

void function(sometype input, ref largearray) 

sobre

largearray function(sometype input) 
+0

Creo que te estás confundiendo; devolvería una referencia a una matriz grande, no a la matriz en sí ... –

+1

Las matrices Stadard .Net ya son tipos de referencia. – Dykam

Respuesta

5

La cantidad de espacio de pila utilizado en un procesador x86 de 32 bits para pasar argumentos de varios tipos:

  • byte: 4 bytes
  • bool: 4 bytes
  • enum: 4 bytes
  • Char: 4 bytes
  • corto: 4 bytes
  • int: 4 bytes
  • largo: 8 b ytes
  • float: 4 bytes
  • doble: 8 bytes
  • decimal: 16 bytes
  • struct: Tamaño de tiempo de ejecución de la estructura

  • cadena: 4 bytes
  • array: 4 bytes
  • objeto: 4 bytes
  • interfaz: 4 bytes
  • puntero: 4 bytes
  • instancia de clase: 4 bytes

Los debajo de la línea son los tipos de referencia, su tamaño se duplicará en un procesador de 64 bits.

Para una llamada de método estático, los primeros 2 argumentos que tienen hasta 4 bytes se pasarán a través de registros de CPU, no de la pila. Para una llamada de método de instancia, solo se pasará un argumento a través de registros. El resto se pasa en la pila. Un procesador de 64 bits admite pasar 4 argumentos a través de registros.

Como se ve claramente en la lista, la única vez que debe considerar pasar un argumento por ref es para las estructuras. La orientación normal para esto es hacerlo cuando la estructura es más grande que 16 bytes. No siempre es fácil adivinar el tamaño del tiempo de ejecución de una estructura, hasta 4 campos generalmente serían precisos. Menos si esos campos son dobles, largos o decimales. Esta guía generalmente recomienda convertir su estructura en una clase, precisamente por esta razón.

También tenga en cuenta que no tiene ahorros pasando un argumento como byte o corto intencionalmente, un int es del tipo con el que está satisfecho un procesador de 32 bits. Lo mismo para los procesadores de 64 bits actualmente disponibles.


Un valor de retorno de método, el verdadero tema de su pregunta casi siempre se devuelve en un registro de la CPU. La mayoría de los tipos se ajustan cómodamente en los registros eax o edx: eax, un registro FPU para valores de coma flotante. Las únicas excepciones son estructuras grandes y decimales, son demasiado grandes para ajustarse a un registro. Se llaman reservando espacio en la pila para el valor de retorno y pasando un puntero de 4 bytes a ese espacio como argumento para el método.

+0

Esta es la respuesta que estoy buscando.Sin embargo, no puedo ver cómo marcar esto como una respuesta: soy un novato y quizás me ciego. – user335023

1

Un parámetro out devuelve una referencia a una instancia de tipo, que no se requiere para ser inicializado antes de enviar en un método.

Un parámetro ref devuelve una referencia a una instancia de tipo, que debe ser inicializado antes de enviar a un método.

Se trata de semántica de llamadas, NO rendimiento.

1

No hay, simplemente devolver la matriz

1

No habría ninguna diferencia entre

void function(sometype input, out largearray output) 

sobre

largearray function(sometype input) 

Sin embargo, si lo hace

largearray function(sometype input, ref largearray output) 

y tu requir Si la persona que llama tiene preasignada la matriz grande, eso sería, por supuesto, más rápido, pero solo importaría si llama al método repetidamente y mantiene la matriz grande asignada entre las llamadas.

Cuestiones relacionadas