Proyecto Mono: Por qué mono es más rápido than.NET?


Me sorprende observar que mono es más rápido que .NET. ¿Alguien sabe por qué es así? Esperaba que mono fuera más lento que.NET, pero al menos no fue el caso con mis experimentos.

Tengo un portátil Windows xp con.NET framework. Estoy ejecutando CentOS en vmware vmplayer en la parte superior de Windows xp. Quería probar la mononucleosis. Así que agarró las fuentes Mono 2.6.1 y lo instaló en CentOS en vmplayer. He escrito una aplicación webservice de prueba usando. Net 2.0 ejecutada en wndows, funcionó, Transferí el binario al centos en el vmplayer sin ninguna recompilación y lo ejecuté en centos. Hurra funcionó! La vida es buena, pero luego algo más atrajo mi atención. La ejecución de la aplicación en centos parecía ser más rápida. No le creí a mis ojos.

Para confirmar mi observación, eliminé la red de la ecuación porque la respuesta de la red depende de muchos factores externos.

Tomé un pequeño código de bucle ficticio de Internet, lo compilé en visual studio ejecutado tanto en windows como en CentOS, los resultados son los siguientes

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 alguien puede explicar este comportamiento,eso sería genial. la comprensión de mi lego es que la implementación de Mono es más eficiente que.NET framework. Incluso si asumo que la implementación matemática de Mono solo es eficiente. Pero muchas implementaciones como el procesamiento de datos financieros, los cálculos gráficos dependen mucho de la biblioteca de matemáticas. Sería más interesante realizar la prueba en Mono / Centos directamente sin vmware pero eso necesita algo de tiempo. Voy a darle una oportunidad puede ser el próximo fin de semana.

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();
    }
 39
Author: funwithcoding, 2010-03-07

4 answers

Esta fue una discusión sobre esto en la lista de correo Mono no hace mucho tiempo. El razonamiento que proporcionaron es Mono está extremadamente optimizado bajo Linux (exactamente cómo no parecía ser mencionado). Pero Mono no es la única variable aquí, si está ejecutando Mono en Linux. Es un sistema operativo diferente, diferentes planificadores de procesos y varios subsistemas a nivel de kernel pueden tener efectos marcadamente diferentes en el rendimiento, independientemente del trabajo del equipo Mono. Mono también hace un uso intensivo de compilador intrínseco, que.NET puede o no puede hacer.

Sin embargo, la mayoría de las veces en un Mono en Windows vs.NET en la comparación de Windows, puede encontrar. NET superando Mono más a menudo que no. Pero incluso entonces, la mononucleosis no siempre pierde. De hecho, para el código específicamente optimizado para Mono (por ejemplo: usando Mono.SIMD), puede obtener un orden de magnitud mejor rendimiento en Mono vs. NET, independientemente de la plataforma.

 59
Author: joemoe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-07 21:36:33

No estás haciendo mucha comparación aquí. Básicamente estás comparando una función (Math.Pow) entre los dos. Presumiblemente una aplicación real hará más cosas que esta función.

Matemáticas de Mono.Pow parece optimizarse implementando esto en C. No sé cómo. Net lo implementa. Se puede implementar completamente en código administrado.

Probablemente encontrará que ambos tiempos de ejecución son lo suficientemente rápidos para las necesidades diarias.

 8
Author: jpobst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-07 22:24:46

Todo lo que realmente prueba es la implementación del temporizador, que generalmente son pruebas malas porque no hay dos sistemas operativos que las implementen de la misma manera. Algunos usan un temporizador duro que es muy exacto (Linux) y algunos tienen un temporizador que se puede adelantar (Windows) basado en las necesidades del sistema. Si desea comparar una llamada que tiene evitar llamadas intermedias o es probable que el tiempo de ellos no lo que usted está pensando que está probando. Math POW va a ser casi el mismo en ambas plataformas ya que las matemáticas para calcularlo no ha cambiado en cien años. Aprendo hacia las diferencias del sistema operativo con el temporizador más que nada.

 -4
Author: Mindmaster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-05 21:00:20

Bueno, no me sorprende que ejecute el mismo código de bytes más rápido.

Si prueba la versión de Windows de Mono, esperaría una diferencia de rendimiento menor, excepto en los casos que involucran operaciones optimizadas SIMD.

 -21
Author: Marko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-28 10:19:39