2009-05-23 10 views
11

Si tiene un objeto Bitmap que necesita pasar a numerosos métodos (alrededor de 10), y finalmente a un evento donde finalmente será eliminado después de ser utilizado, sería (rendimiento sabio) beneficioso para pasarlo a cada uno de esos métodos por referencia en lugar de valor?C# palabra clave 'ref', rendimiento

Pasando por valor, el objeto se copia, pasando por referencia, no.

(rendimiento es crítico en esta situación. La aplicación tiene que correr tan rápido como sea posible.)

+0

vb.net: [which-is-faster-byval-or-byref] (http://stackoverflow.com/questions/408101/which-is-faster-byval-or-byref) – nawfal

+0

Ahora hay forma cómo se podría pasar un mapa de bits por valor. – IllidanS4

Respuesta

30

Bitmap es un tipo de referencia. Pasar un tipo de referencia por valor no copia el objeto, simplemente la referencia al objeto. No habría ningún beneficio de rendimiento al pasar el mapa de bits por referencia en lugar de por valor.

7

Qué tipo está usando exactamente para mantener el mapa de bits? Por ejemplo, System.Drawing.Bitmap es un tipo/clase de referencia. Cuando pasa una referencia a un método (como argumento), la referencia se pasa por valor. (Se realiza una copia de la referencia ... no el objeto) De modo que se asignarían cuatro bytes en una máquina de 32 bits para contener la copia.

El uso de la palabra clave ref no tiene mucha relación con el rendimiento, excepto que se pasa la misma referencia (no se realiza una copia de la referencia). Tiene las siguientes ventajas

  • borra sólo la intención de que el método de tomar el parámetro puede modificarlo, y la persona que llama puede obtener un valor posterior ejecución modificada.
  • Y la variable debe ser inicializada por el destinatario antes de pasarse como argumento a la función llamada que toma el parámetro ref.
+0

Gracias por los detalles brote! –

+0

"Usar la palabra clave ref ... solo borra la intención". Ummm, no creo que eso sea cierto. Una referencia pasada por byf (objeto **) puede ser reasignada por la persona que llama; afectando a qué objeto hacen referencia las personas que llaman. Pasar una referencia por valor (objeto *) pasa una copia de la referencia, aislando las llamadas-referencia de los cambios dentro de la calle. Este artículo http://preview.tinyurl.com/oda4jz tiene un ejemplo en C#. – corlettk

+0

Correcto. Por lo tanto, el método que toma un parámetro ref obliga a los llamadores a escribir explícitamente ref antes del argumento, para asegurarse de que los que llaman entienden y están de acuerdo con la semántica. Aclara la intención de que la persona que llama está pasando un argumento completamente consciente de que el argumento puede tener un valor/estado diferente después de la llamada al método. – Gishu

15

Dado que Bitmap es un tipo de referencia, no existe una diferencia práctica para el rendimiento en este escenario, ya que se está aprobando por referencia al método.

Recomendaría Jon Skeet's article on the subject para una explicación detallada de cómo "por referencia" y "por valor" funcionan en C#.

+0

Gracias por el enlace al artículo, realmente me ayudó. Apreciarlo brote –

+0

recomendación de artículo agradable. Es una gran lectura entender a fondo los tipos de valor/referencia y el parámetro que pasa por valor/referencia. –

5

El 'ref' no pasa el objeto a la función, sino que pasa una referencia a la variable en la que está almacenado en/at.

Si el objeto es una clase o una interfaz, cada vez que acceda a esa variable en la función, tiene que desreferenciarla y luego acceder a la variable. Si se pasó sin la palabra clave 'ref', entonces no tendría que hacer el paso de desreferencia (por lo tanto, será un poco más rápido).

Si el objeto es una estructura (o enum u otro tipo base), la palabra clave 'ref' pasa una referencia a la variable que almacena la estructura, que aún provoca el ligero golpe de dereferencia cuando lo usa, pero si no lo especifica, entonces el programa tiene que asignar memoria para una nueva instancia de la estructura y luego copiarla. En la mayoría de los casos, es más rápido pasar estructuras a través de la palabra clave ref, pero este puede no ser el caso si se trata de una estructura realmente pequeña, o si se desreferencia mucho (y me refiero a MUCHO).

Así que si está pasando una estructura, entonces ref generalmente es el camino a seguir, de lo contrario no habrá mucha diferencia (la sobrecarga en la fase de eliminación de referencias es minúscula).

Ah, y para responder realmente a la pregunta, un mapa de bits es una clase, por lo que la palabra clave 'ref' no generará realmente una diferencia de velocidad sobre un parámetro que no es `` aref ''.

+0

+1 para señalar el beneficio de pasar por referencia para las estructuras, y una explicación más detallada de las implicaciones de rendimiento de la desreferenciación. – Didaxis