39 votes

Projet Mono : Pourquoi Mono est-il plus rapide que .NET ?

Je suis surpris de constater que mono est plus rapide que .NET. Quelqu'un sait-il pourquoi il en est ainsi ? Je m'attendais à ce que mono soit plus lent que .NET mais ce n'est pas le cas, du moins dans mes expériences.

J'ai un ordinateur portable Windows xp avec .NET framework. Je fais tourner CentOS sur vmware vmplayer au-dessus de Windows xp. Je voulais essayer Mono. J'ai donc récupéré les sources de Mono 2.6.1 et l'ai installé sur CentOS dans vmplayer. J'ai écrit une application webservice de test en utilisant .Net 2.0, je l'ai exécutée sur Windows, elle a fonctionné, j'ai transféré le binaire sur CentOS dans le vmplayer sans aucune recompilation et je l'ai exécutée sur CentOS. Hourra, ça a marché ! La vie est belle mais quelque chose d'autre a attiré mon attention. L'exécution de l'application sur centos semblait être plus rapide. Je n'en croyais pas mes yeux.

Pour confirmer mon observation, j'ai éliminé le réseau de l'équation car la réponse du réseau dépend de nombreux facteurs externes.

J'ai récupéré un petit code de boucle factice sur Internet, je l'ai compilé dans Visual Studio et exécuté sous Windows et CentOS, les résultats sont les suivants

Output on windows console is HelloConsole\bin\Debug>HelloConsole.exe
Result =2.66666664666712E+24
37443.6077769661 ms

Output on Centos console is [rupert@bagvapp Math.Pow]$ mono HelloConsole.exe
Result =2.66666664666712E+24
28790.6286 ms

Si quelqu'un peut expliquer ce comportement, ce serait formidable. D'après ce que je comprends, l'implémentation de Mono est plus efficace que le cadre .NET. Même si je suppose que l'implémentation mathématique de Mono est la seule efficace. Mais beaucoup d'implémentations comme le traitement des données financières, les calculs graphiques dépendent beaucoup de la bibliothèque mathématique. Il serait plus intéressant d'effectuer le test sur Mono/Centos directement sans vmware mais cela demande du temps. Je vais faire un essai, peut-être le week-end prochain.

public static void DummyLoop()
    {
        double sumOfPowers = 0;
        int count = Convert.ToInt32(ConfigurationManager.AppSettings["count"]);

            for (int i = 0; i < count; i++)
            {
                sumOfPowers += Math.Pow(i, 2);   
            }

        Console.WriteLine("Result =" + sumOfPowers);   
    }

    static void Main(string[] args)
    {
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
        DummyLoop();
        stopWatch.Stop();
        double ms = (stopWatch.ElapsedTicks * 1000.0) / Stopwatch.Frequency;
        Console.WriteLine(string.Concat(ms.ToString(), " ms"));
        Console.ReadLine();
    }

59voto

joemoe Points 2552

Il y a eu une discussion à ce sujet sur le site Liste de diffusion Mono il n'y a pas si longtemps. Le raisonnement qu'ils ont fourni est que Mono est extrêmement optimisé sous Linux (comment exactement ne semble pas avoir été mentionné). Mais Mono n'est pas la seule variable ici, si vous exécutez Mono sous Linux. C'est un système d'exploitation différent, des planificateurs de processus différents et divers sous-systèmes au niveau du noyau peuvent avoir des effets très différents sur les performances, indépendamment du travail de l'équipe Mono. Mono fait également un usage intensif de intrinsèques du compilateur ce que .NET peut ou ne peut pas faire.

Cependant, la plupart du temps, sur un Mono sur Windows par rapport à .NET sous Windows, vous constaterez que .NET bat Mono plus souvent qu'à son tour. Mais même dans ce cas, Mono ne perd pas toujours. En fait, pour le code spécifiquement optimisé pour Mono (par exemple, en utilisant Mono.SIMD), vous pouvez obtenir des performances supérieures d'un ordre de grandeur sous Mono par rapport à .NET, quelle que soit la plate-forme.

8voto

jpobst Points 8928

Vous ne faites pas vraiment beaucoup de comparaison ici. Vous comparez une fonction (Math.Pow) entre les deux. Vraisemblablement, une application réelle fera plus de choses que celle-ci.

Math.Pow de Mono semble être optimisé en implémentant ceci en C. Je ne sais pas comment .Net le met en œuvre. Il peut être entièrement implémenté dans le code managé.

Vous constaterez probablement que les deux exécutions sont suffisamment rapides pour répondre aux besoins quotidiens.

-4voto

Mindmaster Points 1

Tout ce que cela teste réellement est l'implémentation du timer - qui sont typiquement de mauvais tests parce qu'il n'y a pas deux OS qui les implémentent de la même façon. Certains utilisent un timer dur qui est très précis (Linux) et d'autres ont un timer qui peut être préempté (Windows) en fonction des besoins du système. Si vous voulez évaluer un appel, vous devez éviter les appels intermédiaires ou vous ne les chronométrez probablement pas comme vous pensez le faire. Le POW mathématique sera presque le même sur les deux plates-formes puisque les mathématiques pour le calculer n'ont pas changé depuis cent ans. J'apprends surtout les différences entre les systèmes d'exploitation avec le chronomètre.

-21voto

Marko Points 13736

Eh bien, je ne suis pas surpris qu'il exécute le même bytecode plus rapidement.

Si vous essayez la version Windows de Mono, je m'attends à une plus petite différence de performance, sauf dans les cas qui impliquent des opérations optimisées SIMD.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X