Sono stato gravemente deluso e ho ricevuto un'applicazione che in determinate situazioni è almeno 100 volte troppo lenta, che devo rilasciare ai nostri clienti molto presto (poche settimane).Qualche "quick wins" per rendere il servizio di remoting .NET più veloce su una singola macchina?
Attraverso alcuni molto semplici profiling ho scoperto che il collo di bottiglia è il suo uso di .NET Remoting per trasferire dati tra un servizio di Windows e il front-end grafico - sia in esecuzione sulla stessa macchina.
Microsoft guidelines dire "Minimizzare viaggi di andata e di evitare le interfacce chiacchierone": scrivere
MyComponent.SaveCustomer("bob", "smith");
piuttosto che
MyComponent.Firstname = "bob";
MyComponent.LastName = "smith";
MyComponent.SaveCustomer();
Penso che questa è la radice del problema nella nostra applicazione. Sfortunatamente le chiamate a MyComponent. * (Il profiler mostra che il 99,999% del tempo è trascorso in tali dichiarazioni) sono disseminate liberamente nel codice sorgente e non vedo alcuna speranza di ridisegnare l'interfaccia in conformità con le linee guida precedenti.
Modifica: In realtà, il più delle volte il front-end legge proprietà di MyComponent anziché scrivere su di esso. Ma sospetto che MyComponent possa cambiare in qualsiasi momento nel back-end.
Ho cercato di vedere se sono in grado di leggere tutte le proprietà da MyComponent in una volta sola e di memorizzarle in cache localmente (ignorando il problema di modifica in qualsiasi momento sopra), ma ciò comporterebbe la modifica di centinaia di righe di codice.
La mia domanda è: sono qualche cosa 'vincente in fretta' che posso provare a migliorare le prestazioni?
Ho bisogno di almeno 100 volte di accelerare. Sono un programmatore C/C++/Delphi e sono piuttosto poco pratico con C# /. NET/Remoting diverso da quello che ho letto negli ultimi due giorni. Sto cercando cose che possono essere completate in pochi giorni - una ristrutturazione importante del codice non è un'opzione.
Solo per i principianti, ho già confermato che sta utilizzando BinaryFormatter.
(Siamo spiacenti, questo è probabilmente una domanda terribile sulla falsariga di 'Come posso tenerne correzione X se io escludo tutte le opzioni possibili' ... ma io sono disperato!)
Edit 2 In risposta al commento di Richard di seguito: credo che la mia domanda si riduce a:
- c'è qualche impostazione che posso cambiare per ridurre il costo di un .NET Remoting di andata e ritorno, quando entrambe le estremità della connessione sono sul stessa macchina?
- Esiste qualche impostazione che posso modificare per ridurre il numero di round-trip, in modo che ogni richiamo di una proprietà dell'oggetto remoto non determini un round-trip separato? E questo potrebbe rompere qualcosa?
È probabile che le opzioni siano limitate, .NET Remoting è fortemente deprecato (tranne che per Inter-AppDomain) a causa della sua mancanza di sicurezza. – Richard
"Quick win" invariabile significa "lento perdere" imho, sii molto diffidente nei confronti di quella frase. – annakata
Se si trattava di WCF, il ["trasporto nullo"] (http://www.codeproject.com/KB/WCF/NullTransportForWCF.aspx) avrebbe potuto essere d'aiuto, ma si tratta di un modello molto diverso rispetto alla comunicazione remota. –