2010-10-02 15 views
10

Estábamos teniendo una discusión en la oficina sobre cómo resolver un problema en particular y se planteó el uso de un evento (sin juego de palabras). La respuesta fue negativa citando mal uso y que pueden ser costosos.Implicaciones de rendimiento de .net Events

Entiendo las preocupaciones detrás del mal uso y sé que solo son un delegado especial de multidifusión, pero dado un escenario donde hay a lo sumo un oyente ¿por qué usar un evento sobre una llamada a un método se considera "caro"?

Actualización:

Para que quede claro que esto no se trata de cualquier implementación particular, se trata de una cuestión más general sobre el coste de utilización de un evento a través de una llamada al método.

+1

Algunos eventos pueden ser más costosos que otros, al igual que algunas llamadas a métodos pueden ser más costosas. En particular, vienen a la mente los eventos que realizan un cálculo de conveniencia (o correr a través de COM). Si bien esto resta valor al punto principal ("¿son caros los delegados de reparto múltiple?"), Creo que puede encajar con la (mis) concepción de que los eventos son" caros ". –

Respuesta

19

Pruébelo en su escenario - Me imagino que muchos, muchos factores pueden afectar esto, especialmente cuando estamos hablando de algo con un costo relativamente bajo como una llamada de método/delegado.

Una prueba rápida y simple con una versión de lanzamiento no bajo un depurador, compilado bajo 4.0 como "cualquier CPU", y se ejecuta en Windows de 64 bits 7:

Otra Editar: Vaya He aquí un mejor resultado . Ver the code de cómo está funcionando

10000000 direct reference calls  : 0.011 s 
10000000 calls through an interface : 0.037 s 
10000000 invocations of an event : 0.067 s 
10000000 calls through Action<int> : 0.035 s 

Así en una recta "hacer prueba de nada" con diez millones de llamadas, un evento añade 0.474 seg [editar , solamente 0,026 ahora en un mucho mejor máquina, aún así aproximadamente el doble)

Me preocuparía más la corrección del diseño de medio segundo cada 10 millones de llamadas, a menos que espere hacer muchas llamadas en cortos períodos de tiempo (en cuyo caso tal vez haya una más fundamental problema de diseño).

+1

La pregunta no era sobre ningún diseño en particular sino sobre por qué "los eventos se considerarían costosos". No existe un escenario de prueba en particular, pero gracias por hacer su prueba y compartir los resultados, responde la pregunta y debe ser útil para los demás. – Bronumski

+0

Y muchos años después fue útil. Gracias. – ThatGuy

12

En .NET 2.0 calling a delegate is just as fast como una llamada de método de interfaz. Incluso parecen ser un poco más rápidos.

Pero incluso si los gastos generales fueran 10 veces más altos, dudo que las llamadas de delegado lleguen a ser el cuello de botella de velocidad en su aplicación. Utilice un generador de perfiles si desea encontrar los cuellos de botella reales.

edición en respuesta a la afirmación de que los eventos son más lentos que los delegados: De hecho, los eventos son delegados. This code muestra que su rendimiento es idéntico, al menos en mi máquina.

+0

No existe una aplicación específica como tal. La discusión fue más retórica que cualquier otra cosa, pero tu enlace fue muy útil, gracias. – Bronumski

+0

Desafortunadamente el enlace que proporcionó estaba usando delegados y no eventos. Después de modificar el código obtuve resultados similares a Philip. – Bronumski

+0

Su enlace aún es útil para cualquiera que desee ver la comparación usando delegados. – Bronumski

4

El rendimiento definitivamente no es algo que deba preocuparse. Estás hablando de nanosegundos aquí. Si tiene un solo oyente, no hay ninguna diferencia.

Simplemente consideraría lo que tiene más sentido en su aplicación, usar eventos o llamar a un método y elegir la mejor opción. La principal diferencia es que un objeto A que genera eventos no tiene que conocer sus escuchas. El mismo objeto A que llama a un método debe conocer la instancia desde la que se llama. ¿Dónde quieres poner la dependencia?

+1

Estoy de acuerdo con su declaración y el propósito de la discusión fue acordar un patrón que fuera lógico y claro. Mi pregunta aquí fue simplemente aclarar la afirmación de que "los eventos son caros". – Bronumski

+0

Estrictamente hablando, la suscripción al evento requiere que el editor capture una instancia del suscriptor; esto es algo importante de entender. Desde una perspectiva de diseño, usted está en lo cierto, sin embargo, usar una interfaz desacoplaría sus objetos lo suficiente. – Gusdor

Cuestiones relacionadas