9
votes

Comment la performance actuelle de la machine virtuelle mono-t-elle?

Le Web regorge de différentes sortes de tests de performance de différentes langues, compilateurs et machines virtuelles. Pourtant, pratiquement aucun de ces tests les performances en utilisant un scénario du monde réel. En outre, la recherche de Google de ce type de référence donne généralement seulement plusieurs points de repère d'années d'âge que ceux qui ont le plus de temps pour les collecter des liens.

Est-ce que vous avez un réel aperçu de la performance actuelle de différentes machines virtuelles? En outre, je voudrais surtout savoir comment les performances de Mono se compare à celles de Microsoft .NET et Sun's Java et comment la performance de différentes machines virtuelles a évolué ces derniers temps.


1 commentaires

C'est Mono Augmentation de la journée au jour de la journée :). Aucune idée en termes absolus.


5 Réponses :


2
votes

Pour une comparaison de Java et Mono, vous pouvez regarder The Computer Language Benchmarks Game .


2 commentaires

Je ne vois aucun signe du réel .NET VM sur cette liste?


Puisqu'il ne fonctionnera pas sur Linux. Mais c'est pourquoi j'ai limité ma réponse à Mono et Java.



1
votes

Pendant que je n'ai pas utilisé Mono, je suppose que cela dépend de ce que vous faites avec cela. Je ne peux pas vous donner des chiffres exacts sur les choses, mais voici une tirée intéressante sur les performances ponctuelles flottantes de Mono:

http://forums.xna.com/forums/p/24249 /24249.aspx

Comme mono permet d'utiliser les instructions de la SIMD de votre CPU (SSE2 et SSE4 pour le moment, je crois) à accélérer considérablement les calculs de points flottants, il peut s'éloigner de .NET à ce genre de chose (jusqu'à 10 fois plus vite), Comme le montre le graphique (et j'espère que Microsoft implémentera quelque chose de similaire, .NET 4.5, s'il vous plaît?). Cependant, le graphique montre également que .NET est toujours significativement plus rapide que mono lorsqu'il n'utilise pas mono.SIMD. Et vous êtes pourriez-vous prendre un énorme saut de foi et extrapoler cette différence de 20% de performances ponctuelles flottantes vers d'autres zones, telles que la performance de la chaîne.

Cependant, c'est-à-dire mono 2.2 et que les choses ont peut-être changé radicalement lorsque mono se déplace assez vite ces jours-ci, alors j'entends.


1 commentaires

La performance de Mono est affreuse et s'est améliorée légèrement et une fois toute sa vie (avec mono 2.2).



12
votes

La performance de mesure est une question compliquée. Dans le passé, lorsque des langues ont été testées contre le même système d'exploitation, exécutez le même matériel et un ensemble de bibliothèques très limitée, il a été possible de créer des points de repère pouvant donner une métrique linéaire qui mesurerait un système. Il laisserait les gens évaluer les choses de zéro à dix, assimiler le résultat et passer rapidement au sujet suivant.

Les choses sont devenues plus compliquées avec les systèmes modernes car il existe plusieurs variables à prendre en compte.

Au moins dans le cas de Mono, il y a beaucoup de variables qui entrent en jeu:

  • code:

    • la qualité du code natif généré.
    • la vitesse à laquelle le code natif est généré.
    • la mémoire requise pour générer le code et optimiser le code
    • est le générateur de code multi-threadé
    • est le fil généré du fil-coffre-fort
    • Profite-t-il des fonctionnalités spécifiques à la CPU, à l'heure de la compilation ou à la JIT.
    • peut-il utiliser des instructions SIMD si disponible.
    • La carte de langue elle-même est-elle soigneusement sur des plates-formes multicœurs
    • La langue fournit-elle suffisamment de paramètres pour un optimisier pour accorder votre code automatiquement (comme Fortran ForTran).
    • Gestion de la mémoire:

      • L'algorithme de collecte des ordures utilisée
      • L'échelle GC avec plusieurs processeurs?
      • est le gc incrémental ou en temps réel?
      • prend-il en charge le stockage de thread-local pour une performance améliorée?
      • est-ce précis, compacté, générationnel, conservateur et quels mélanges de chacun.
      • Design API:

        • sont les API conçues pour la latence ou la bande passante
        • Les API sont-elles prises en charge automatiquement à plusieurs processeurs.
        • Pouvez-vous décharger un travail intensif à un GPU?
        • Faites vos API Prise en charge des interfaces en streaming

          Toutes ces choses compliquent beaucoup de choses et font une simple réponse de 0 à 10 très difficile à donner.

          Si vous deviez partitionner des langues dans des classes et que vous assumez un programmeur compétent et de performance, je diviserais le monde dans ces classes:

          • Tier 1: Langue d'assemblage réglable à la main par un professionnel
          • Tier 2: Statiquement compilé, fortement typé Langues: C / C ++ / Fortran /
          • Tier 3: Géré / JIT Langues: Java / C # /. NET / Mono / BOO / F #
          • Tier 4: Tapée dynamiquement / Jité des langues: Google V8, IronPython, IronRuby
          • Tier 5: Pure interprété Langues: Python, Perl
          • Tier 6: pure langues interprétées, avec trop de fonctionnalités pour leur propre bien.

            Mais les langues ne peignent pas une image entière, les API que vous consommerez, le système d'exploitation d'hébergement et d'autres installations auront un impact important sur vos résultats.

            Par exemple, récemment dans Mono, nous avons ajouté une assistance pour remplacer le moteur Gén de code de Mono avec un moteur plus avancé et hautement optimisant (le moteur LLVM). Il s'avère que c'était incroyablement difficile de trouver un test où les frais généraux d'utilisation de LLVM valaient la valeur supplémentaire: les applications de bureau et Web n'ont pas présenté une grande partie de la différence. Et cela est probablement dû au fait que ceux-ci sont principalement des applications liées aux E / S.

            Utiliser LLVM a été utile pour des applications intensifs scientifiques et informelles, mais dans la vie réelle, cela n'a pas apporté une grande partie des paramètres d'optimisation par défaut de Mono.

            Quant aux détails de Mono: Bien que mono utilise le GC de Boehm, ce que la plupart des gens ne réalisent pas, c'est que Boehm peut être configuré de différentes manières. La configuration Layman par défaut n'est en effet pas très puissante, mais cela fonctionne pour tout le monde qui veut un GC rapide. Mono n'utilise pas BOEHM dans ce mode, la mono configure de manière approfondie Boehm de travailler en mode précis, tout en tirant parti des modes de stockage locaux, de gc multicœurs et de la mémoire à la mémoire à la mémoire à la mémoire.


2 commentaires

Merci Miguel mais ce que vous n'avez pas osé devait donner des mesures de performance réelles du monde. Ce serait particulièrement intéressant serait la performance de ASP.NET MVC sur mono versus rubis sur rails / CakePHP / etc. en cours d'exécution sur le même serveur.


Vous devez savoir ce que vous testez. Si vous avez deux applications similaires, une en mono avec ASP.NET MVC et une avec des rails / CakePHP, je peux les essayer et signaler les résultats. Si le code est informellement intensif, Mono sera plus rapide, simplement parce qu'il a une JIT pour un système fortement saisi. Si le code est io-lié, cela dépendra vraiment de la manière dont le code a été écrit.



0
votes

Je sais que c'est vieux, mais je viens de le trouver et aucune des réponses actuelles (même de Miguel) adresse une faille fondamentale dans votre question: une machine virtuelle.

Vous semblez être mal informés sur ce point. .NET n'utilise pas de VM, et non plus mono. Il est vrai que .NET utilise une bibliothèque Runtime , et le code compile à IL pour un déploiement similaire à celui de Java's Bytecode. Cependant, un runtime n'est pas une machine virtuelle. La différence est que, après le déploiement, l'IL est lui-même entièrement compilé au code de machine natif avant l'exécution. Aucune machine virtuelle n'a besoin d'appliquer.


0 commentaires

1
votes

i Benchmarked mono 2.0 et 2.2 plus tôt cette année en utilisant < un href = "http://math.nist.gov/scimark2/" rel = "Nofollow NOREFERRER"> scimark2 et a constaté que la performance de Mono avait légèrement augmenté, mais il est encore beaucoup plus lent que la plupart des autres VMS.


0 commentaires