2011-01-21 12 views
8

Possiedo un'applicazione ASP.NET che funziona correttamente sul mio computer di sviluppo Windows. Il server è Linux su cui è in esecuzione Mono, e una volta caricato lo stesso codice è in esecuzione 4 o 5 volte più lento di quanto non faccia sulla casella di Windows (prendendo 25 secondi contro 5 secondi per un'attività, ad esempio).Il codice C# è veloce su IIS, ma lento su Mono - come migliorarlo?

Questa prestazione è un problema noto con Mono? E c'è qualcosa che posso fare al riguardo? Il codice è principalmente l'elaborazione del testo, sostituzioni di stringhe, espressioni regolari e simili, se questo fa alcuna differenza. Ho profilato e debugato il mio codice usando VS localmente, ma non so se è possibile eseguire il debug remoto sul server con Mono, o cosa devo fare per sistemarlo in seguito.

+2

Cosa fare: pagare per Windows :) Seriamente, però, Mono tende ad essere 2-5 volte più lento di MS .NET. Stai usando l'ultimo Mono? La versione 2.8 mi sembrava abbastanza buona per quanto riguarda le prestazioni. – leppie

+1

leggi questo? http://stackoverflow.com/questions/929210/performance-of-asp-net-in-monolinux-vs-iiswindow – naveen

+0

Mi sposterò su Windows hosting se questo è l'unico modo. Avevo letto che le prestazioni Mono erano approssimativamente uguali a quelle di ASP.NET, quindi mi stavo chiedendo se mi mancasse qualcosa perché la performance è molto peggiore. – mikel

risposta

6

espressioni regolari sono una zona particolarmente debole per Mono. La classe Regex di Mono usa sempre il codice interpretato, mentre .Net può trasformarlo in IL compilato, risultando in un'esecuzione molto più veloce.

La maggior parte delle altre forme di elaborazione del testo come le sostituzioni devono essere approssimativamente simili.

+1

Grazie, sembra essere il caso. L'esecuzione di alcuni microbenchmarks ha mostrato che le stesse espressioni regolari erano fino a dieci (!) Volte più lente su Mono di IIS. Mi sono imbattuto in un bug "critico" sul loro bugzilla (https://bugzilla.novell.com/show_bug.cgi?id=655133) anche su questo. Le prestazioni più lente in generale sembrano tenere conto del resto del ritardo, ma probabilmente sarebbe accettabile se non fosse per le regex. Ho intenzione di migrare a IIS, penso. – mikel

1

Si sta utilizzando oggetti StringBuilder o si sta eseguendo la catenaria delle stringhe. Se stai facendo un sacco di lavoro con le corde avrai dei bug di prestazioni.

Ma penso che leppie ce l'abbia in testa, Microsoft ha speso molti soldi per testare e integrare ASP.net in IIS in modo che fosse davvero, molto veloce. Se non vuoi pagare per la scatola MS, dovrai affrontare il fatto che Mono è open source e IIS è un prodotto commerciale testato.

Un buon esempio è qui, dove Microsoft ha effettivamente modificato Windows stesso con una libreria in modalità kernel che funziona con il server IIS. Le app correttamente progettate utilizzando la cache in modo corretto possono ottenere ottimi risultati in questo codice: HTTP.sys

1

Stai utilizzando mod_mono o mod_proxy per questo? Anche se ci sono dei limiti a ciò che si può ottenere da Mono, si otterrà anche un ritardo generale con mod_mono rispetto a mod_proxy.

Vedere la "mod_mono e mod_proxy" sezione a Mono ASP.NET FAQ

+0

Questo sta già utilizzando mod_mono. – mikel

1

According to this academic study, Le prestazioni mono possono essere ostacolate in alcune distribuzioni Linux a causa della "propensione molto più rapida dei sistemi Linux a passare allo spazio cache/swap del disco rigido" [rispetto a Windows].

"Si prega di notare la grande differenza indicato nelle due sistemi operativi anche utilizzando codice nativo. A 131072 interi nella matrice del Fedora Core 4 Prova del sistema 3 operativo eseguito più di 3 volte più lento del esatto stesso codice in Windows. "

Poiché le configurazioni di pianificazione del kernel di distribuzione Linux variano, sarebbe utile sapere quale distribuzione del sistema operativo e versione sono in esecuzione sul server Linux e quanta memoria e cicli di CPU sono disponibili per l'applicazione.

4

Installare Mono, preferibilmente su un sistema Linux simile al server. Dai un profilo al tuo codice su Mono e scopri dove sono i colli di bottiglia.

Ho un'app Mono in esecuzione su un server Linux che segue i file di registro di Apache. L'ho sviluppato su Windows e durante il test su Linux, ho trovato qualcosa di simile a 8-10 volte più lento su Mono 2.4 vs.NET 3.5. La maggior parte del tempo è dedicato alle funzioni Regex.Match e stringa. Sono stato in grado di raddoppiare la velocità complessiva del programma in Mono solo specificando StringComparison.Ordinal in 4 chiamate a string.EndsWith(). Se i confronti delle stringhe ordinali sono quelli che vuoi, questo potrebbe darti un aumento di velocità.

Anche con StringComparison.Ordinal, string.StartsWith() era ancora lento. Ho ottenuto un aumento del 25% nella velocità complessiva del programma scrivendo la mia versione di string.StartsWith().

Quindi, se i confronti ordinali sono ciò che deve fare la tua app, prova a specificare StringComparison.Ordinal o scrivendo le tue funzioni di stringa.

+0

Interessante, grazie. Darò questo andare. – mikel

Problemi correlati