tunel telepeaje quito por peajes peaje pasarse pagar multas multa guayasamin c# performance appdomain

c# - telepeaje - ¿Cuál es la multa mínima de rendimiento de comunicación de Cross AppDomain?



multas peajes (3)

¿Hay alguna forma en que pueda llamar a un solo método auxiliar que tome parámetros acerca de cuántas veces desea llamar al método que necesita? El rendimiento de las llamadas de dominio de aplicación cruzado varía mucho según la implementación. Creo que podría ser significativamente mejor en el CLR 4.0, pero no estoy completamente versado en los detalles allí.

En general, sin embargo, usted desea evitar la sobrecarga al "agrupar" las llamadas a través de un método auxiliar.

Estoy tratando de minimizar la penalización de rendimiento de la comunicación a través de AppDomains en la misma máquina. En mi ejemplo de juguete, la clase A se carga en el dominio de aplicación 1. Crea un dominio de aplicación 2 y carga una instancia de la clase 2 (la clase 2 se hereda de MarshalByRef) recuperando un proxy. Luego, la Clase 1 llama repetidamente un método en el proxy que no devuelve ningún valor.

Obtengo los siguientes resultados:

  1. Sin AppDomains, ambas clases se cargan en el mismo AppDomain y las primeras llamadas repiten el método en la segunda (el método no tiene parámetros): 24 millones de llamadas a métodos / seg.
  2. Dos AppDomain como se describe anteriormente, el método no tiene parámetros o parámetros de cadena de "sangrado": 340.000 métodos de llamadas / seg.
  3. Dos AppDomains como se describió anteriormente, un parámetro serializable (matriz de dos cadenas): 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é soy 100 veces más lento desde el caso 1 al caso 2 . A mi entender, una vez que se crea el proxy, todas las invocaciones de método subsiguientes deben ser realmente rápidas, ya que no se están ordenando datos de un dominio de aplicación a otro. ¿Alguien ahora por qué la comunicación a través de AppDomains es tan lenta? ¿Estoy haciendo algo mal?

PS1. El único consejo que tengo sobre esto está here : "Y el costo de cruzar un límite de dominio de aplicación es vergonzoso". Estaba adivinando 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 del método)

PS3. Estoy utilizando .NET 3.5 en una máquina WinXP SP3. También probé .NET 4.0 Beta 1 sin diferencias significativas.


He visto los mismos resultados. No puedo explicar por qué es mucho más lento, excepto que es más rápido que tener dos procesos diferentes ejecutándose y comunicándose entre sí. En mi diseño me encontré con un dilema similar. Al final, modifiqué mi diseño para crear dominios de aplicaciones independientes; el dominio de la aplicación fue capaz de hacer su trabajo sin la necesidad de comunicarse con otro dominio de la aplicación durante la ejecución ... Solo informaría datos cuando se completara.


Si cuenta las líneas de IL involucradas en cada escenario, verá que el CLR está haciendo mucho más de 100 veces el trabajo cuando se realiza la comunicación remota. Una invocación directa es solo algunos códigos de operación, pero con el control remoto hay múltiples clases involucradas, proxies reales / transparentes, controles de seguridad, serialización, yadda yadda yadda. Deberá abordar esto a través del diseño: no existe una solución mágica para mejorar el rendimiento a través de la implementación.