Sto cercando di ridurre al minimo la penalità di prestazioni della comunicazione tra AppDomains nello stesso computer. Nel mio esempio di esempio, la classe A viene caricata in AppDomain 1. Crea un AppDomain 2 e carica lì un'istanza di Class 2 (la classe 2 eredita da MarshalByRef) restituendo un proxy. Quindi la classe 1 chiama ripetutamente un metodo sul proxy che non restituisce alcun valore.Qual è la penalità minima per le prestazioni di comunicazione Cross AppDomain?
ottengo i seguenti risultati:
- Nessun AppDomain, entrambe le classi vengono caricate nello stesso dominio di applicazione e le prime chiamate repetedly il metodo sul secondo (il metodo non ha parametri): 24 milioni metodo chiamate/sec
- due AppDomain come sopra descritto, il metodo non ha parametri o "bleeding" parametri stringa: 340.000 metodi invita/sec
- due AppDomain come descritto sopra, un parametro serializable (array di due stringhe s): 64.000 metodo chiamate/sec
Anche se capisco la pena di prestazioni tra 2 e 3 (serializzazione), io davvero non capisco per questo che sono 100 volte più lento da caso a caso 1 2 . A mio avviso, una volta creato il proxy, tutte le successive invocazioni del metodo devono essere molto veloci poiché nessun dato viene eseguito il marshalling da un AppDomain all'altro. Qualcuno ora perché comunicare tra AppDomain è così lento? Sto facendo qualcosa di sbagliato?
PS1. L'unico suggerimento che ho su questo è here: "E il costo di attraversare un confine AppDomain è imbarazzante.". Immagino che si riferisca alla serializzazione ...
PS2. Non conteggio del tempo di creazione AppDomain o Proxy (i miei benchmark iniziano nel primo richiamo del metodo)
PS3. Sto usando .NET 3.5 in una macchina WinXP SP3. Ho anche provato .NET 4.0 Beta 1 senza differenze significative.
+1 Sono d'accordo con te completamente. Una semplice chiamata al metodo diretto è estremamente semplice. Una chiamata di metodo attraverso ** remoting ** è molto più pesante. Il sovraccarico è molto più grande. L'unica vera soluzione è una buona progettazione dell'applicazione che non dipenda dalla velocità della comunicazione cross AppDomain. – jpbochi