Подтвердить что ты не робот

Mono Project: Почему моно быстрее, чем .NET?

Я удивлен, заметив, что моно быстрее, чем .NET. Кто-нибудь знает, почему это так? Я ожидал, что моно будет медленнее, чем .NET, но не было, по крайней мере, моих экспериментов.

У меня есть ноутбук с Windows XP с .NET framework. Я запускаю CentOS на vmware vmplayer поверх windows xp. Я хотел попробовать моно. Так захватили источники Mono 2.6.1 и установили его на CentOS в vmplayer. Я написал тестовое приложение webservice, используя .Net 2.0, выполнив его на wndows, он сработал, я передал двоичный код в centos в vmplayer без какой-либо перекомпиляции и выполнил его на centos. Ура, это сработало! Жизнь хороша, но потом что-то еще привлекло мое внимание. Выполнение приложения на centos, казалось, было быстрее. Я не поверила своим глазам.

Чтобы подтвердить мое наблюдение, я исключил сеть из уравнения, потому что ответ сети зависит от множества внешних факторов.

Я схватил небольшой код фиктивного контура из Интернета, скомпилировал его в визуальной студии, выполненной в окнах, а также CentOS, результаты выглядят следующим образом

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


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

Если кто-нибудь может объяснить это поведение, это было бы здорово. мое понимание непрофессионала - это реализация Mono, более эффективная, чем .NET framework. Даже если я предполагаю, что реализация Mono Math эффективна. Но множество реализаций, таких как обработка финансовых данных, графические вычисления, зависят от библиотеки Math. Было бы более интересно выполнить тест на Mono/Centos напрямую без vmware, но это требует некоторого времени. Я попробую попробовать в следующий уик-энд.

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

Ответ 1

Это была дискуссия об этом в Mono mailing list не так давно. Обоснование, которое они предоставили, - это Mono чрезвычайно оптимизировано под Linux (точно так же, как, казалось, не упоминалось). Но Mono не является единственной переменной здесь, если вы используете Mono в Linux. Это другая ОС, разные планировщики процессов и различные подсистемы уровня ядра могут иметь существенно отличающиеся эффекты от производительности, независимо от работы команды Mono. Моно также сильно использует встроенные компиляторы, которые .NET может или не может делать.

Однако большую часть времени в сравнении с Mono on Windows vs .NET при сравнении Windows вы можете обнаружить, что .NET чаще избивает Mono, а затем нет. Но даже тогда Моно не всегда проигрывает. Фактически, для кода, специально оптимизированного для Mono (например, с использованием Mono.SIMD), вы можете получить на порядок лучшую производительность в Mono vs .NET, независимо от платформы.

Ответ 2

На самом деле вы не сравнитесь здесь. Вы в основном сравниваете одну функцию (Math.Pow) между ними. Предположительно, реальное приложение будет делать больше, чем эта функция.

Mono Math.Pow выглядит оптимизированным, реализуя это в C. Я не знаю, как .NET реализует его. Он может быть полностью реализован в управляемом коде.

Вероятно, вы обнаружите, что обе время работы достаточно быстро для удовлетворения потребностей каждого дня.

Ответ 3

Все это на самом деле проверяет реализацию таймера - обычно это плохие тесты, потому что ни одна из двух ОС не реализует их одинаково. Некоторые используют жесткий таймер, который является очень точным (Linux), а некоторые имеют таймер, который может быть выгружен (Windows) на основе системных потребностей. Если вы хотите сравнить вызов, вы избегаете промежуточных звонков, или вы, вероятно, не считаете их не тем, что вы думаете о тестировании. Math POW будет почти одинаковым на обеих платформах, так как математика для расчета не изменилась за сто лет. Я больше узнаю о различиях ОС с таймером.

Ответ 4

Ну, я не удивлен, что он быстрее выполняет тот же байт-код.

Если вы попробуете версию Mono для Windows, я ожидаю меньшую разницу в производительности, за исключением случаев, связанных с оптимизированными SIMD-операциями.