Я удивлен заметить, что моно быстрее, чем.NET. Кто-либо знает, почему это так? Я ожидал моно быть медленнее, чем.NET, но не имел место по крайней мере с моими экспериментами.
У меня есть ноутбук Windows XP с платформой.NET. Я выполняю CentOS на VMware vmplayer сверху Windows XP. Я хотел попробовать моно. Так захватил Моно 2.6.1 источников и установил его на CentOS в vmplayer. Я записал тестовое использование приложения веб-сервиса.Net 2.0 выполнил его на wndows, оно работало, я передал двоичный файл песням в vmplayer без любой перекомпиляции и выполнил его на песнях. Ура это работало! Жизнь хороша, но тогда что-то еще соблазнило мое внимание. Выполнение приложения на песнях, казалось, было быстрее. Я не верил глазам.
Для подтверждения моего наблюдения я устранил сеть из уравнения, потому что сеть reponse зависит от партии внешних факторов.
Я захватил маленький фиктивный код цикла из Интернета, скомпилировал его в Visual Studio, выполняемой в окнах, а также CentOS, результаты следующие
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
Если бы кто-либо может объяснить это поведение, которое было бы большим. понимание моего неспециалиста является реализацией Mono, более эффективно, чем платформа.NET. Даже если я предполагаю, что Математическое внедрение Mono только эффективно. Но партия реализаций как обработка финансовых данных, графические вычисления зависят партия от библиотеки 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();
}
Это было обсуждение этого в списке рассылки Mono не так давно. Причина, по которой они представили, заключается в том, что Mono чрезвычайно оптимизирован под Linux (как именно, похоже, не упоминалось). Но Mono здесь не единственная переменная, если вы используете Mono в Linux. Это другая ОС, разные планировщики процессов и разные подсистемы уровня ядра могут заметно по-разному влиять на производительность, независимо от работы команды Mono. Mono также активно использует встроенные функции компилятора , которые .NET может делать или не делать.
Однако в большинстве случаев при сравнении Mono в Windows и .NET в Windows вы можете обнаружить, что .NET чаще превосходит Mono, чем нет. Но даже тогда Моно не всегда может проиграть. Фактически, для кода, специально оптимизированного для Mono (например, с использованием Mono.SIMD), вы можете получить на порядок большую производительность на Mono по сравнению с .NET, независимо от платформы.
На самом деле вы не проводите сравнение. В основном вы сравниваете одну функцию (Math.Pow) между двумя. Предположительно, реальное приложение будет делать больше вещей, чем эта одна функция.
Math.Pow в Mono выглядит оптимизированной за счет реализации этой функции в C. Я не знаю, как это реализовано в .Net. Возможно, она полностью реализована в управляемом коде.
Скорее всего, вы обнаружите, что оба режима выполнения достаточно быстры для повседневных нужд.
Ну, я не удивлен, что он выполняет тот же байт-код быстрее.
Если вы попробуете версию Mono для Windows, я ожидаю меньшую разницу в производительности, за исключением случаев, связанных с операциями, оптимизированными для SIMD.