为了确认我的观察结果,我将网络排除在外,因为网络响应取决于许多外部因素。我从互联网上获取了一个小型虚拟循环代码,在Visual Studio中编译,并在Windows和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 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();
}
Math.pow()
的实现,这很可能不能反映出框架和 VM 性能的整体表现。如果你简化循环内部的计算,比如像sumOfPowers += 1
这样的无足轻重的操作,那么你就会测试 for 循环以及一个微不足道的变量赋值,这可以告诉你一些东西,但仍然不能作为 Mono 的基准测试,因为你也(非常)在测试 C# 编译器实现的性能。许多因素... - mindplay.dk