Я удивлен, заметив, что моно быстрее, чем .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();
}