Topic: 跨平台的客场交锋:.NET vs. JAVA on Linux |
Print this page |
1.跨平台的客场交锋:.NET vs. JAVA on Linux | Copy to clipboard |
Posted by: jerryjerry123 Posted on: 2005-05-06 13:27 自从.net推出以来,.net与java之间的明争暗斗就一直没有停息过,但是战斗一直都仅 限于理论层面上,互相都只摆出自己的一堆大道理,口水都快淹死人了,但却从来没有 真刀真枪的干上一仗。为什么呢?原因是.net一直在家里不出来,哪里都不去。他们没 有机会真正的碰过面。 但现在她们终于有机会真正进行一场公平的竞赛了,一年前就一定开始的.net开放源码 计划MONO不久前刚刚推出了最新版本0.13,虽然还是个开发中的产品,但是我已经忍不 住要把她请出来和java过过招了。 再进行枯燥的数据对比以前,请先看一段浪漫的故事,了解一下.net,mono之间的关 系,谢谢。 :) 话说很java不服气,虽然java上门去找.net比划过几招,但是.net的父亲老比对她很不 欢迎,而且好象也没比赢。Java很生气:“有什么了不起,不就是比我年轻几岁吗?老 娘当年风光的时候你还没出生呢,只在家算什么厉害,在你们家我当然比不过你了,有 种出来呀!”。 这边老麦很是得意:“大家看看,我还当.net是什么大美女呢,连客都不敢见,多半笨 得连话都说不清楚。看我们家java多好,人见人爱,上得厅堂下得厨房,让她去哪就去 哪,半句都不罗嗦。” 这边老比答话了:“谁说咱们家.net不行?她不仅系出名门,天资国色,而且能听懂几 乎所有国家的语言,我还专门请了编织大师安德斯到我们家来专门教她刺绣。不过她是 大家闺秀,岂能跟你们家那个野丫头一样到处乱跑,谁都可以摸一把。再说了,这里大 部分的土地都属于我们家,她出不出去其实都一样。” .net虽然生活无虑,每天有人伺候,但是还是经常照着镜子叹气:“唉,都怪我老爸, 限制人家自由,虽然可以每天穿好衣服,但是只有我们家的人才能看到我,我想让世界 上所有的人都来赞叹我的美丽,让各种人用不同的语言对我说:‘我爱你’。”。 .net的话有一天被一个英俊的小伙子听到了,他就是开发出了Linux下著名的x-windows 系统gnome的ximian。他第一次见到.net就被她的美貌给深深打动了,他对身旁的人说: “我终于发现,她就是我真正想要的”。他还发现.net是microsoft家族中唯一一个想要 出去的人。于是他每天抽空跟她讲一些发生在他们那里的美好的故事,讲他们那里有很 多很多勤劳善良的人,那里没有等级,没有剥削,大家都无私的贡献出自己的劳动成果 让大家一起来分享。都自觉的遵守着他们自己制定的平等的制度GNU,那个繁荣自由的国 度就是Linux。 “啊?Linux!”.net吃惊的叫了起来,“我知道!我爸爸说那里是坏蛋居住的地方,那 里的人们很穷,他们自己不知道怎么去赚钱维生,每天只想到去如何攻击掠夺别人的家 园,还一直嚷嚷着要把我们的家给拆散,要把我们家里的东西全部抢走!” “那些并不是真的”ximian平静的说:“我可以带你去那里看看,美丽的小姐,你会被 他们的勤劳善良和伟大给感动的”。 “真的吗?”.net美丽的大眼睛里闪动着向往和好奇,然后坚定的说:“我一定要去那 里看看,即使是父亲不允许,我也一定要去!”。 当晚,.net脱下高贵的华服,换上粗陋的布衣,跟ximian出发了。 此时,老比其实把一切都看在了眼里,但是他并没有阻止ximian,他叹了口气说道: “去吧,孩子,毕竟时代不一样了,你一定会成为我们家族最大的荣耀的”。同时,他 的嘴角闪过了一丝不容易被察觉的微笑,精明的老比此刻正想着什么呢? 故事还在发展,现在还看不到任何结局,.net在linux国度里改名叫做mono,她从最基本 的开始学起,慢慢的适应了linux的生活,一年过去了,mono终于推出了最新的版本 0.13,在这个版本里,我们看到了很多重要的进步,慢慢的开始显露出了.net的才华和 美丽。 下面,我们要做一些测试,看看.net是否真正的适应了linux的生活,和她原来比起来究 竟有多大的差距,同时,我们还邀请到了java,做为友情客串,她只是提供一些参考性 的测试数据。当然,这并不是一场和java很正式的比赛,有点难为mono了,毕竟,mono 还只是一款正在开发中的产品。 首先,我们来进行一个循环测试,循环测试被很多人指责太过于简单,不能很好的反映 出真实的运行环境,但是它的优点也在于它的简单,因为程序越复杂,写法就越多,争 论的焦点就变成了如何对程序进行最优化,例如著名的宠物店大战。同时也因为曾经有 一个很有名的测试,是对一个jsp的循环速度测试,结果是jsp是7秒,asp和php都是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 Linux,J2SE 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下的测试: 使用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大军 的疯狂进攻。 |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |