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();
}