跨平台的客场交锋:.NET vs. JAVA on Linux

本文围绕.NET和Java展开,介绍了.NET开放源码计划MONO最新版本0.13。通过十亿次循环测试,对比了Mono和Java在Windows和Linux系统下的编译器和执行环境性能。结果显示,Mono表现出色,与.NET相当且超Java,Java跨平台能力强。

自从.net推出以来,.netjava之间的明争暗斗就一直没有停息过,但是战斗一直都仅限于理论层面上,互相都只摆出自己的一堆大道理,口水都快淹死人了,但却从来没有真刀真枪的干上一仗。为什么呢?原因是.net一直在家里不出来,哪里都不去。他们没有机会真正的碰过面。

但现在她们终于有机会真正进行一场公平的竞赛了,一年前就一定开始的.net开放源码计划MONO不久前刚刚推出了最新版本0.13,虽然还是个开发中的产品,但是我已经忍不住要把她请出来和java过过招了。

再进行枯燥的数据对比以前,请先看一段浪漫的故事,了解一下.netmono之间的关系,谢谢。 :)

话说很java不服气,虽然java上门去找.net比划过几招,但是.net的父亲老比对她很不欢迎,而且好象也没比赢。Java很生气:“有什么了不起,不就是比我年轻几岁吗?老娘当年风光的时候你还没出生呢,只在家算什么厉害,在你们家我当然比不过你了,有种出来呀!”。

这边老麦很是得意:“大家看看,我还当.net是什么大美女呢,连客都不敢见,多半笨得连话都说不清楚。看我们家java多好,人见人爱,上得厅堂下得厨房,让她去哪就去哪,半句都不罗嗦。”

这边老比答话了:“谁说咱们家.net不行?她不仅系出名门,天资国色,而且能听懂几乎所有国家的语言,我还专门请了编织大师安德斯到我们家来专门教她刺绣。不过她是大家闺秀,岂能跟你们家那个野丫头一样到处乱跑,谁都可以摸一把。再说了,这里大部分的土地都属于我们家,她出不出去其实都一样。”

.net虽然生活无虑,每天有人伺候,但是还是经常照着镜子叹气:“唉,都怪我老爸,限制人家自由,虽然可以每天穿好衣服,但是只有我们家的人才能看到我,我想让世界上所有的人都来赞叹我的美丽,让各种人用不同的语言对我说:‘我爱你’。”。

.net的话有一天被一个英俊的小伙子听到了,他就是开发出了Linux下著名的x-windows系统gnomeximian。他第一次见到.net就被她的美貌给深深打动了,他对身旁的人说:“我终于发现,她就是我真正想要的”。他还发现.netmicrosoft家族中唯一一个想要出去的人。于是他每天抽空跟她讲一些发生在他们那里的美好的故事,讲他们那里有很多很多勤劳善良的人,那里没有等级,没有剥削,大家都无私的贡献出自己的劳动成果让大家一起来分享。都自觉的遵守着他们自己制定的平等的制度GNU,那个繁荣自由的国度就是Linux

“啊?Linux!”.net吃惊的叫了起来,“我知道!我爸爸说那里是坏蛋居住的地方,那里的人们很穷,他们自己不知道怎么去赚钱维生,每天只想到去如何攻击掠夺别人的家园,还一直嚷嚷着要把我们的家给拆散,要把我们家里的东西全部抢走!”

“那些并不是真的”ximian平静的说:“我可以带你去那里看看,美丽的小姐,你会被他们的勤劳善良和伟大给感动的”。

“真的吗?”.net美丽的大眼睛里闪动着向往和好奇,然后坚定的说:“我一定要去那里看看,即使是父亲不允许,我也一定要去!”。

当晚,.net脱下高贵的华服,换上粗陋的布衣,跟ximian出发了。

此时,老比其实把一切都看在了眼里,但是他并没有阻止ximian,他叹了口气说道:“去吧,孩子,毕竟时代不一样了,你一定会成为我们家族最大的荣耀的”。同时,他的嘴角闪过了一丝不容易被察觉的微笑,精明的老比此刻正想着什么呢?

故事还在发展,现在还看不到任何结局,.netlinux国度里改名叫做mono,她从最基本的开始学起,慢慢的适应了linux的生活,一年过去了,mono终于推出了最新的版本0.13,在这个版本里,我们看到了很多重要的进步,慢慢的开始显露出了.net的才华和美丽。

下面,我们要做一些测试,看看.net是否真正的适应了linux的生活,和她原来比起来究竟有多大的差距,同时,我们还邀请到了java,做为友情客串,她只是提供一些参考性的测试数据。当然,这并不是一场和java很正式的比赛,有点难为mono了,毕竟,mono还只是一款正在开发中的产品。

首先,我们来进行一个循环测试,循环测试被很多人指责太过于简单,不能很好的反映出真实的运行环境,但是它的优点也在于它的简单,因为程序越复杂,写法就越多,争论的焦点就变成了如何对程序进行最优化,例如著名的宠物店大战。同时也因为曾经有一个很有名的测试,是对一个jsp的循环速度测试,结果是jsp7秒,aspphp都是80多秒,被java爱好者津津乐道了很久,我当时也用asp.net测试过是2秒,当然操作系统环境不一样,不具备太大参考价值。也是后话。

下面是用于进行测试的程序,主要功能就是执行十亿次循环,循环里面有一个加法运算和一个赋值运算。硬件测试环境为:P3-M 1.2G, 512M, 30G(笔记本电脑)。软件测试环境为:Mono 0.13 for Linux, Mono 0.13 for Windows, .Net Framework SDK 1.0.3705(中文版), J2SE 1.4.0_01 for LinuxJ2SE 1.4.0_01 for Windows, Windows操作系统为:Windows XP中文版,Linux操作系统为:Mandrake Linux 8.2。编译方式均采用默认选项。输出的结果均为运行所需时间,单位为毫秒。

以下是该测试程序的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下的测试:

使用monoC# 编译器编译以上代码命令行:

monomcs /out:mtest.exe test.cs

提示编译成功,产生一个mtest.exe文件。

直接输入mtest,采用microsoft.net运行环境来运行,程序运行成功,没有任何错误提示,显示运行结果为:2613

输入mono mtest.exe,采用mono.net运行环境来运行,程序运行成功,没有任何错误提示,显示运行结果为:4336

使用microsoftC#编译器编译以上代码命令行:

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.cstest.java拷贝到linux系统下。

具体操作和windows下没多大区别,这里只报告一下结果:

mono mtest.exe结果为4205

mono wtest.exe 结果为2527

java test结果为 4197

然后用linux下的编译器分别重新编译了MonoJava的源码,运行:

mono test.exe 结果为 4205

java test 结果为5876

这里值得一提的是,monofor windows版和for linux版编译出来的代码没有任何差别,运行结果也几乎没什么差距。Javafor windows版和for linux版编译出来的两个class文件有差异,并且运行结果也有很大的差距。

另外,由于mono在两个平台下编译出来的可执行文件完全一样,所以没有将linux下编译的程序放到windows上进行测试,仅仅将javalinux下编译的可执行程序放到windows上进行测试,结果是5087

以下是这次测试结果的对照表(毫秒)

编译器

平台

.Net Framework

MONO.Net

JAVA for Win

JAVA for Linux

.Net Framework

2563

2613

-

-

Windows

2654(Mono)

4336(Mono)

6039java

5087 (java)

Linux

2527(Mono)

4205(Mono)

4197java

5876java

       通过比较这个测试结果,我们发现了两个很有趣的现象,一个是monojit在运行原生.net编译器编译出来的可执行文件时,效果很好,和原生.netjit运行效率很接近。但是运行它自己的编译器编译出来的可执行文件时,效率却变得很差,这种情况在windowslinux下都一样。但是原生.netjit运行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大军的疯狂进攻。

 

结合每一场z和h分析以下每一个例子,总结所有例子的都适用的判断运算,编写一个完整的C语言程序程序(C语言不能使用预存储数据) 要求如下:输入主场5个数值a1,a2,a3,a4,a5——主场近五场得分数据(已排序) 输入客场5个数值b1,b2,b3,b4,b5——客场近五场得分数据(已排序) 输入让分z(给定值) 输入大小分h(给定值) 判断x+z-y的值是否大于0。 判断x+y-h是的值否大于0。 (其中x为主场下一场的预测值,y为客场下一场的预测值,z为下一场主队与客队的让分给定值,h为下一场主队与客队的大小分给定值)。程序输出格式与例子保持一致,必须满足每一条例子的结果判断,用程序验证所有例子并且列举每一运行示例,必须每一个例子中x+z-y和x+y-h判断正确。 例如1、输入主场数:79 80 89 89 110 输入客场数:53 71 78 92 93 让分:-14.5 大小分:169.5 得出的结果为:x+z-y>0,x+y-h>0 例如2、输入主场数:71 77 80 81 82 输入客场数:77 90 90 92 96 让分:+7.5 大小分:164.5 得出的结果为:x+z-y<0,x+y-h<0 例如3、输入主场数:71 81 86 90 92 输入客场数:73 85 88 89 103 让分:-7.5 大小分:166.5 得出的结果为:x+z-y>0,x+y-h<0 例如4、输入主场数:66 67 82 96 100 输入客场数:75 77 89 91 104 让分:+5.5 大小分:167.5 得出的结果为:x+z-y>0,x+y-h>0 例如5、输入主场数:106 117 125 128 148 输入客场数:100 112 125 129 132 让分:+1.5 大小分:235.5 得出的结果为:x+z-y<0,x+y-h>0 例如5、输入主场数:98 108 109 143 148 输入客场数:101 128 129 130 130 让分:+11.5 大小分:240.5 得出的结果为:x+z-y<0,x+y-h>0 例如6、输入主场数:97 99 100 105 121 输入客场数:102 114 121 129 141 让分:+1.5 大小分:217.5 得出的结果为:x+z-y<0,x+y-h>0 例如7、输入主场数:97 111 116 118 124 输入客场数:110 122 129 131 142 让分:-1.5 大小分:231.5 得出的结果为:x+z-y<0,x+y-h>0 例如8、输入主场数:86 113 113 120 131 输入客场数:111 116 121 129 134 让分:+3.5 大小分:226.5 得出的结果为:x+z-y>0,x+y-h>0 例如9、输入主场数:105 113 114 123 151 输入客场数:105 105 110 113 149 让分:-2.5 大小分:243.5 得出的结果为:x+z-y<0,x+y-h<0 例如10、输入主场数:110 111 117 117 142 输入客场数:91 101 108 111 127 让分:-1.5 大小分:233.5 得出的结果为:x+z-y>0,x+y-h>0 例如11、输入主场数:109 109 116 121 148 输入客场数:103 109 114 124 140 让分:-6.5 大小分:235.5 得出的结果为:x+z-y>0,x+y-h<0 例如12、输入主场数:101 107 112 116 124 输入客场数:102 115 116 123 131 让分:+2.5 大小分:225.5 得出的结果为:x+z-y>0,x+y-h>0 例如13、输入主场数:97 99 110 111 123 输入客场数:97 110 111 120 122 让分:-2.5 大小分:221.5 得出的结果为:x+z-y>0,x+y-h<0 例如14、输入主场数:93 100 104 112 122 输入客场数:94 99 103 105 115 让分:-2.5 大小分:198.5 得出的结果为:x+z-y>0,x+y-h<0 例如15、输入主场数:79 86 91 92 101 输入客场数:72 84 86 100 112 让分:+3.5 大小分:183.5 得出的结果为:x+z-y<0,x+y-h>0 例如16、输入主场数:74 78 80 90 104 输入客场数:74 75 81 84 88 让分:-1.5 大小分:171.5 得出的结果为:x+z-y>0,x+y-h>0 例如17、输入主场数:70 78 86 96 100 输入客场数:69 73 75 96 107 让分:-5.5 大小分:169.5 得出的结果为:x+z-y<0,x+y-h<0 例如18、输入主场数:78 82 82 94 97 输入客场数:77 86 88 88 90 让分:+3.5 大小分:165.5 得出的结果为:x+z-y<0,x+y-h>0 例如19、输入主场数:92 96 88 88 115 输入客场数:90 101 107 121 130 让分:-3.5 大小分:220.5 得出的结果为:x+z-y<0,x+y-h<0 例如20、输入主场数:106 117 119 125 148 输入客场数:97 99 102 105 121 让分:-9.5 大小分:217.5 得出的结果为:x+z-y>0,x+y-h<0 例如21、输入主场数:105 113 113 123 151 输入客场数:96 103 106 110 120 让分:-10.5 大小分:240.5 得出的结果为:x+z-y<0,x+y-h>0 例如22、输入主场数:98 100 115 118 121 输入客场数:108 118 119 130 133 让分:-4.5 大小分:228.5 得出的结果为:x+z-y<0,x+y-h<0 例如23、输入主场数:99 102 103 111 118 输入客场数:97 104 116 120 121 让分:+1.5 大小分:227.5 得出的结果为:x+z-y<0,x+y-h>0 例如24、输入主场数:93 94 85 105 105 输入客场数:94 95 96 101 102 让分:+1.5 大小分:196.5 得出的结果为:x+z-y>0,x+y-h<0 例如25、输入主场数:79 85 86 94 94 输入客场数:87 89 93 96 103 让分:-8.5 大小分:171.5 得出的结果为:x+z-y<0,x+y-h>0 例如26、输入主场数:71 74 81 84 91 输入客场数:74 80 89 91 96 让分:-7.5 大小分:164.5 得出的结果为:x+z-y>0,x+y-h>0 例如27、输入主场数:78 79 81 84 89 输入客场数:77 82 88 90 93 让分:-1.5 大小分:164.5 得出的结果为:x+z-y>0,x+y-h<0 例如28、输入主场数:100 111 119 119 122 输入客场数:101 105 116 130 133 让分:+8.5 大小分:226.5 得出的结果为:x+z-y<0,x+y-h<0 例如29、输入主场数:75 84 86 86 106 输入客场数:73 73 85 89 103 让分:+2.5 大小分:175.5 得出的结果为:x+z-y>0,x+y-h>0 例如30、输入主场数:88 91 92 100 100 输入客场数:76 81 83 83 91 让分:-13.5 大小分:169.5 得出的结果为:x+z-y>0,x+y-h>0 例如31、输入主场数:67 76 90 94 98 输入客场数:67 73 86 95 96 让分:+6.5 大小分:165.5 得出的结果为:x+z-y<0,x+y-h<0 例如32、输入主场数:97 111 116 118 124 输入客场数:100 112 125 129 134 让分:-1.5 大小分:234.5 得出的结果为:x+z-y>0,x+y-h<0 例如33、输入主场数:110 122 123 129 142 输入客场数:102 114 121 129 141 让分:-11.5 大小分:230.5 得出的结果为:x+z-y<0,x+y-h>0 例如34、输入主场数:111 116 120 127 129 输入客场数:111 117 117 125 142 让分:-9.5 大小分:242.5 得出的结果为:x+z-y>0,x+y-h<0 例如35、输入主场数:82 104 110 114 115 输入客场数:91 101 111 115 127 让分:-7.5 大小分:209.5 得出的结果为:x+z-y<0,x+y-h<0 例如36、输入主场数:86 113 120 125 131 输入客场数:105 105 110 113 114 让分:+4.5 大小分:222.5 得出的结果为:x+z-y>0,x+y-h>0 例如37、输入主场数:96 103 106 110 130 输入客场数:128 129 130 130 135 让分:+12.5 大小分:236.5 得出的结果为:x+z-y>0,x+y-h>0 例如38、输入主场数:101 107 112 117 124 输入客场数:103 108 109 114 124 让分:+5.5 大小分:233.5 得出的结果为:x+z-y<0,x+y-h>0 例如39、输入主场数:106 107 110 111 123 输入客场数:97 102 110 111 122 让分:-1.5 大小分:219.5 得出的结果为:x+z-y>0,x+y-h<0 例如40、输入主场数:109 116 121 125 148 输入客场数:102 115 116 123 131 让分:-1.5 大小分:227.5 得出的结果为:x+z-y<0,x+y-h<0 例如41、输入主场数:73 83 86 91 93 输入客场数:76 78 87 90 95 让分:-1.5 大小分:168.5 得出的结果为:x+z-y<0,x+y-h>0 例如42、输入主场数:88 88 92 96 100 输入客场数:119 121 126 128 132 让分:11.5 大小分:223.5 得出的结果为:x+z-y<0,x+y-h<0 例如43、输入主场数:86 112 113 125 131 输入客场数:90 101 107 113 121 让分:-10.5 大小分:219.5 得出的结果为:x+z-y>0,x+y-h<0 例如44、输入主场数:105 113 123 1288 151 输入客场数:98 108 109 119 143 让分:-5.5 大小分:250.5 得出的结果为:x+z-y<0,x+y-h>0 例如45、输入主场数:128 129 130 135 146 输入客场数:100 103 115 118 121 让分:-11.5 大小分:221.5 得出的结果为:x+z-y<0,x+y-h>0 例如46、输入主场数:99 102 103 111 117 输入客场数:108 113 118 130 133 让分:-1.5 大小分:232.5 得出的结果为:x+z-y<0,x+y-h<0 例如47、输入主场数:101 112 117 121 124 输入客场数:106 115 117 119 148 让分:9.5 大小分:231.5 得出的结果为:x+z-y<0,x+y>0 例如48、输入主场数:89 94 103 105 115 输入客场数:93 96 104 112 122 让分:-3.5 大小分:194.5 得出的结果为:x+z-y<0,x+y-h>0
07-07
结合每一场z和h分析以下每一个例子,总结所有例子的都适用的判断运算,编写一个完整的C语言程序程序(C语言不能使用预存储数据)要求如下:输入主场5个数值a1,a2,a3,a4,a5——主场近五场得分数据(已由时间先后顺序排列) 输入客场5个数值b1,b2,b3,b4,b5——客场近五场得分数据(已由时间先后顺序排列) 输入让分z(给定值),z为正表示主队加分,z为负表示主队减分 输入大小分h(给定值)判断x+z-y的值是否大于0。判断x+y-h是的值否大于0。(其中x为主场下一场的预测值,y为客场下一场的预测值,z为下一场主队与客队的让分给定值,h为下一场主队与客队的大小分给定值)。程序输出格式与例子保持一致,必须满足每一条例子的结果判断,用程序验证所有例子并且列举每一运行示例,必须每一个例子中x+z-y和x+y-h判断正确。例如1、输入主场数:108 119 119 162 111 输入客场数:108 95 105 128 91 让分:-5.5 大小分:234.5 得出的结果为:x+z-y<0,x+y-h<0例如2、输入主场数:106 105 104 97 94 输入客场数:99 91 103 110 93 让分:-1.5 大小分:220.5 得出的结果为:x+z-y>0,x+y-h<0例如3、输入主场数:120 118 111 92 121 输入客场数:128 101 126 132 122 让分:+2.5 大小分:212.5 得出的结果为:x+z-y<0,x+y-h<0例如4、输入主场数:103 104 119 109 112 输入客场数:98 122 112 122 118 让分:+8.5 大小分:220.5 得出的结果为:x+z-y<0,x+y-h<0例如5、输入主场数:99 108 140 104 127 输入客场数:121 129 113 132 121 让分:+4.5 大小分:235.5 得出的结果为:x+z-y<0,x+y-h<0例如6、输入主场数:141 103 121 125 132 输入客场数:128 146 129 119 119 让分:-14.5 大小分:239.5 得出的结果为:x+z-y>0,x+y-h>0例如7、输入主场数:123 120 113 101 120 输入客场数:103 101 86 100 115 让分:-9.5 大小分:220.5 得出的结果为:x+z-y<0,x+y-h>0例如8、输入主场数:115 106 120 117 134 输入客场数:102 111 121 121 148 让分:-4.5 大小分:226.5 得出的结果为:x+z-y>0,x+y-h<0
07-17
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值