Estoy tratando de minimizar la penalización de rendimiento de la comunicación entre AppDomains en la misma máquina. En mi ejemplo de juguete, la Clase A se carga en AppDomain 1. Crea un AppDomain 2 y carga allí una instancia de Clase 2 (Clase 2 hereda de MarshalByRef) obteniendo un proxy. Luego, la Clase 1 llama repetidamente a un método en el proxy que no devuelve ningún valor.¿Cuál es la penalización mínima en el rendimiento de comunicación Cross AppDomain?
puedo obtener los siguientes resultados:
- No hay dominios de aplicación, ambas clases se cargan en el mismo dominio de aplicación y las primeras llamadas repetedly el método en el segundo (el método no tiene parámetros): 24 millones método llamadas/seg
- dos dominio de aplicación como se describe anteriormente, el método no tiene parámetros o "sangrado" parámetros de cadena: 340.000 métodos llamadas/sec
- dos dominios de aplicación como se describe anteriormente, un parámetro serializable (array de dos cuerdas s): 64.000 llamadas de método/seg
Aunque entiendo la penalización de rendimiento entre 2 y 3 (serialización), realmente no entiendo por qué estoy 100 veces más lento de caso a caso 1 2 . A mi entender, una vez que se crea el proxy todas las invocaciones subsecuentes de métodos deben ser realmente rápidas ya que no se están organizando datos de un AppDomain a otro. ¿Alguien ahora por qué comunicarse en AppDomains es tan lento? ¿Estoy haciendo algo mal?
PS1. El único consejo que tengo sobre esto es here: "Y el costo de cruzar un límite de AppDomain es vergonzoso". Supongo que se refiere a la serialización ...
PS2. No cuento el tiempo de creación de AppDomain o Proxy (mis puntos de referencia comienzan en la primera invocación de método)
PS3. Estoy usando .NET 3.5 en una máquina WinXP SP3. También probé .NET 4.0 Beta 1 sin diferencias significativas.
+1 Estoy de acuerdo contigo por completo. Una simple llamada directa al método es extremadamente simple. Una llamada a método a través de ** remoting ** es mucho más pesada. La sobrecarga es mucho más grande. La única solución real es un buen diseño de aplicación que no dependería de la velocidad de la comunicación cruzada de AppDomain. – jpbochi