以下是该测试程序的C#程序代码:
using System;
class test
{
static void Main(string[] args)
{
int temp;
DateTime a = DateTime.Now;
for(int i = 0; i < 1000000000; i++)
{
temp = 1+1;
}
DateTime b = DateTime.Now;
TimeSpan c = b - a;
Console.WriteLine(c.TotalMilliseconds);
}
}
以下是相应的java程序代码:
import java.util.Date;
public class test
{
public static void main(String args[])
{
Date before = new Date();
long a,b;
int temp;
a = before.getTime();
for(int i = 0; i < 1000000000; i++)
{
temp = 1 + 1;
}
Date after = new Date();
b = after.getTime();
System.out.println(b - a);
}
}
由于mono自己有编译器和执行环境,那么我们就要分别对编译器和执行环境进行测试和对比,下面是测试过程和结果:
(所有测试结果全部是运行十次,取最短的一次时间)
在windows下的测试:
使用mono的C# 编译器编译以上代码命令行:
monomcs /out:mtest.exe test.cs
提示编译成功,产生一个mtest.exe文件。
直接输入mtest,采用microsoft的.net运行环境来运行,程序运行成功,没有任何错误提示,显示运行结果为:2613
输入mono mtest.exe,采用mono的.net运行环境来运行,程序运行成功,没有任何错误提示,显示运行结果为:4336
使用microsoft的C#编译器编译以上代码命令行:
csc /out:wtest test.cs
提示编译成功,但产生了一个警告:“temp变量已经被赋值,但是从未使用过”,这个警告是正常的,我们可以不用管它,它也不会给这次测试带来任何影响。同时生成了一个wtest.exe文件。
直接输入wtest,采用microsoft的.net运行环境来运行,程序运行成功,没有任何错误提示,显示运行结果为:2563
输入mono wtest.test,采用mono的.net运行环境来运行,程序运行成功,没有任何错误提示,显示运行结果为:2654
使用java编译器编译java源文件:
javac test.java
结果没有任何错误和警告提示,并生成一个test.class文件
输入:java test,采用java运行环境来运行,程序运行成功,没有任何错误提示,显示运行结果为:6039
在linux下的测试:
将以上三个可执行文件:mtest.exe , wtest.exe, test.class及源码文件test.cs,test.java拷贝到linux系统下。
具体操作和windows下没多大区别,这里只报告一下结果:
mono mtest.exe结果为4205
mono wtest.exe 结果为2527
java test结果为 4197
然后用linux下的编译器分别重新编译了Mono和Java的源码,运行:
mono test.exe 结果为 4205
java test 结果为5876
这里值得一提的是,mono的for windows版和for linux版编译出来的代码没有任何差别,运行结果也几乎没什么差距。Java的for windows版和for linux版编译出来的两个class文件有差异,并且运行结果也有很大的差距。
另外,由于mono在两个平台下编译出来的可执行文件完全一样,所以没有将linux下编译的程序放到windows上进行测试,仅仅将java在linux下编译的可执行程序放到windows上进行测试,结果是5087。
以下是这次测试结果的对照表(毫秒):
编译器
平台
.Net Framework
MONO.Net
JAVA for Win
JAVA for Linux
.Net Framework
2563
2613
-
-
Windows
2654(Mono)
4336(Mono)
6039(java)
5087 (java)
Linux
2527(Mono)
4205(Mono)
4197(java)
5876(java)
通过比较这个测试结果,我们发现了两个很有趣的现象,一个是mono的jit在运行原生.net编译器编译出来的可执行文件时,效果很好,和原生.net的jit运行效率很接近。但是运行它自己的编译器编译出来的可执行文件时,效率却变得很差,这种情况在windows和linux下都一样。但是原生.net的jit运行mono编译出来的可执行文件却又还可以。难道是mono不喜欢自己的亲生儿子?:)
还有一个是java的“跨平台”能力最强,在windows下编译的程序,放到linux下执行起来速度比较快,在linux下编译的程序放到windows下执行比较快,难道这就是java为跨平台能力进行的优化? :)
另外,值得一提的就是在windows下用java编译的本程序直接放到linux下使用会产生两个警告。重新编译以后警告消失。
在这次的测试中,mono不负众望,以远远出乎我们意料的好成绩和.net站在了同一条线上(甚至可以看到本次测试中的最好成绩竟然属于mono,但是我认为几十毫秒的差距完全可以忽略不计,不能认为mono的效率超过了.net)。同时,无论是在windows平台,还是在linux平台,mono的表现都超过了java。要知道,她还仅仅只是一个在开发中的产品。
.net拥有最先进的技术,拥有最速的效率,现在,她不仅能跨语言,还能跨平台,甚至还开放了源代码,Mono的开发计划中就有Linux, Power PC, Solaris, Strong ARM等版本。还有微软支持的FreeBSD版本。
当然,java也不会是省油的灯,不知道SUN的下步棋会如何走,才能得以抵挡住.net大军的疯狂进攻。