8
votes

C # Le code fonctionne rapidement sur IIS, mais lent sur mono - comment l'améliorer?

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).

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.


4 commentaires

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.


5 Réponses :


1
votes

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.

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é.

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


0 commentaires

1
votes

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.

S'il vous plaît voir la section "mod_mono et mod_proxy" à FAQ Mono ASP.NET


0 commentaires


1
votes

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].

"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. "

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.


0 commentaires

4
votes

Installez Mono, de préférence sur un système Linux similaire à votre serveur. Profil de votre code sur mono et voir où sont les goulots d'étranglement.

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.

Même avec StringComParonSon.ordinal, String.Startswith () était toujours lent. J'ai une augmentation de 25% de vitesse globale du programme en écrivant ma propre version de String.Startswith ().

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.


0 commentaires