J'ai une application ASP.NET qui fonctionne bien sur ma machine de développement Windows. Le serveur est en cours d'exécution Linux, et une fois téléchargée, le même code est exécuté 4 ou 5 fois plus lent à celui-ci que dans la zone Windows (prenant 25 secondes VS 5 secondes pour une tâche par exemple). p>
Cette performance est-elle un problème connu avec Mono? Et y a-t-il quelque chose que je puisse faire à ce sujet? Le code est principalement le traitement du texte, la chaîne remplace, les regexes et similaires, si cela fait une différence. J'ai profilé et débogué mon code en utilisant VS localement, mais je ne sais pas s'il est possible de déboguer à distance sur le serveur avec mono, ou de ce que je dois faire à côté de le réparer vraiment. P>
5 Réponses :
Utilisez-vous des objets StressBuilder ou faites-vous une caténation de chaîne? Si vous faites beaucoup de travail de string, vous toucherez quelques bugs de performance. P>
Mais je pense que Lappie l'a sur la tête, Microsoft a dépensé beaucoup d'argent et intégrer ASP.NET dans IIS afin que c'était vraiment, vraiment rapide. Si vous ne voulez pas payer pour la zone MS, vous allez devoir faire face au fait que Mono est open source et IIS est un produit commercial testé. P>
Un bon exemple est là, où Microsoft a réellement modifié Windows lui-même avec une bibliothèque de mode noyau qui fonctionne avec le serveur IIS. Les applications correctement architecturées utilisant le cache correctement peuvent obtenir de très bonnes augmentations de performances dans ce code: http.sys p>
Utilisez-vous mod_mono ou mod_proxy pour cela? Bien qu'il existe des limitations à ce que vous pouvez sortir de mono, vous allez également obtenir un délai moins général à l'aide de mod_mono que mod_proxy. P>
S'il vous plaît voir la section "mod_mono et mod_proxy" à FAQ Mono ASP.NET A > p>
Les regexes sont une zone particulièrement faible pour mono. La classe Regex de Mono utilise toujours un code interprété, tandis que .NET peut la transformer en IL compilé, ce qui entraîne une exécution beaucoup plus rapide. P>
La plupart des autres formes de traitement de texte comme des remplacements doivent être grossièrement similaires. P>
Merci, cela semble être le cas. Courir certaines microbenchmarks a montré que les mêmes regex étaient jusqu'à dix (!) Fois plus lentement sur mono que IIS. Je suis tombé sur un bug "critique" sur leur bugzilla ( bugzilla.novell.com/show_bug. CGI? ID = 655133 ) À ce sujet aussi. Les performances plus lentes de manière générale semblent rendre compte du reste du retard, mais il serait probablement acceptable sinon pour les regexnes. Je vais migrer vers IIS, je pense.
Selon cette étude académique , les performances mono peuvent être entravées dans certaines distributions Linux En raison de certains systèmes Linux "" beaucoup de propension plus rapide d'aller au cache du disque dur / espace de swap "[par rapport à Windows]. P>
"Veuillez noter la vaste différence indiqué dans les deux systèmes d'exploitation même en utilisant du code natif. À 131072 entiers dans le tableau le noyau de Fedora 4 Test 3 Système d'exploitation effectué plus de 3 fois plus lent que le exactement le même code dans Windows. " P> blockQuote>
As Linux Distribution Les configurations de planification du noyau varient, il serait utile de savoir quelle distribution et la version du système d'exploitation que vous utilisez sur votre serveur Linux et la quantité de cycles de mémoire et de processeur sont disponibles pour votre application. P>
Installez Mono, de préférence sur un système Linux similaire à votre serveur. Profil de votre code J'ai une application mono exécutée sur un serveur Linux qui suit les fichiers journaux Apache. Je l'ai développé sous Windows et lorsque vous le testez sur Linux, j'ai trouvé que c'était quelque chose comme 8-10 fois plus lent sur Mono 2.4 vs.NET 3.5. La majeure partie de son temps est dépensée dans Regex.Match et fonctions de chaîne. J'ai pu doubler la vitesse globale du programme en mono juste en spécifiant StringComparonSon.ordinal en 4 appels à String.Wewith (). Si les comparaisons de cordes ordinales sont ce que vous voulez, cela pourrait vous donner un boost de vitesse. P>
Même avec StringComParonSon.ordinal, String.Startswith () était toujours lent. J'ai une augmentation de 25% de Donc, si les comparaisons ordinales sont ce que votre application doit faire, essayez de spécifier StringComParison.Antininal ou écrire vos propres fonctions de chaîne. P>
Que faire: Payer pour Windows :) Sérieusement, Mono a tendance à être un 2-5 fois plus lent que Mme .NET. Utilisez-vous le dernier mono? La version 2.8 sentit de très bonnes performances sage pour moi.
lis ça? Stackoverflow.com/ Questions / 929210 / ...
Je vais passer à Windows hébergeant si c'est le seul moyen. J'avais lu la performance mono était à peu près sur un pair avec ASP.NET, alors je me demandais simplement si je manquais quelque chose comme la performance est tellement pire.
Je recommanderais d'exécuter quelques microbenchmans pour voir où se trouve le problème. Ce pourrait être votre regex fonctionne plus lentement sur mono, ou mono concaténe des cordes plus lentes. Vous pourrez peut-être trouver quelques opérations sous-optimales et les remplacer avec celles qui sont plus rapides sur mono.