.Net和Java的执行性能比较

时间:2023-02-04 20:11:29
     首先,我个人不是那种执着于语言之争的那种人,不过今天测试了下Java和C#的执行效率。
测试计算100000000次PI值的代码如下:
C#的代码:
using System;
public class CalcPI
{
 public const int Count=100000000;
 public static void Main(string[] args)
 {
  DateTime start=DateTime.Now;
  Random random=new Random(start.Millisecond);
  int Inside=0;
  for(int i=0;i<Count;i++)
  {
   double cx=random.NextDouble();
   double cy=random.NextDouble();
   double distance=Math.Sqrt((cx*cx)+(cy*cy));
   if(distance<1.0)
   {
    ++Inside;
   }
  }
  double pi=4*(double)Inside/(double)Count;
  DateTime end=DateTime.Now;
  TimeSpan diff=end-start;
  Console.WriteLine("pi={0}",pi);
  Console.WriteLine("消耗时间:{0}ms",diff.TotalMilliseconds);
 }
 
}
 Java的代码:
import java.util.*;
public class CalcPI
{
 public static final int COUNT=100000000;
 public static void main(String[] args)
 {
  long start=System.currentTimeMillis();
  Random random=new Random(start);
  int inside=0;
  for(int i=0;i<COUNT;i++)
  {
   double cx=random.nextDouble();
   double cy=random.nextDouble();
   double distance=Math.sqrt((cx*cx)+(cy*cy));
   if(distance<1.0)
   {
    ++inside;
   }
  
  }
  double pi=4*(double)inside/(double)COUNT;
  long end=System.currentTimeMillis();
  long lastTime=end-start;
  System.out.println ("pi="+pi);
  System.out.println ("所用时间:"+lastTime+"ms");
 }
}
我的本本Windows 7下的执行结果(测试了两次):
.Net和Java的执行性能比较

可以看到C#的执行效率在Java的3倍以上。

如果说是因为.Net和Windows系统都是微软的产品,微软必然会对它进行应有的优化的话,那为了公平,我在公司的Linux服务器上进行了测试。

Linux下的执行结果(也测试了两次):
.Net和Java的执行性能比较
这里我先补充一下mono作为在非Windows平台下的.Net虚拟机,是Mono团队开发的,并非出自微软之手。执行效率上C#也是Java的两倍多。
排除了微软在系统上为.Net开小灶的可能后,至少可以在这个程序上做出一个结论:同样是解释型的语言,.Net的运行速度明显高了Java很多。
对于CSDN上 http://topic.csdn.net/t/20020818/21/950887.html这篇帖子里提到的如果Java执行采用HotSpot Server选项可以提高3倍的执行效率,我也做了测试:
.Net和Java的执行性能比较

 可以看到与之前的测试结果没有差别。

 

在这里我不对语言本身做什么令人争论的评论,我也不说什么语言之间的好与坏。(争论语言的好坏是初学者常干的事)

我只澄清以下几个经常被用来做语言之争的地方:

1.只有Java才可以在跨平台?

如果你还是这么认为的话,你的认知还停留在好几年前。从第二个例子开始你就应该知道.Net程序可以通过mono在Linux下运行。而且mono的.Net虚拟机已经涵盖了几乎所有的操作系统,包括Android。而且MonoGame已经可以将XNA开发的2D游戏运行在Android和iPhone上了,而且对于WP7程序开发你也只能用.Net。所以从跨平台角度Java已经没有什么优势可言。

2.Java和.Net的运行效率一样?

至少从我的实验可以看出,在数位运算上Java虚拟机和.Net虚拟机的效率比起来低了一个档次。当然对于其它方面的执行效率,大家可以试下。

3.开发效率上的比较。

对于大型项目,开发效率是选择的重要依据。不可否认Java的开发效率比C/C++高出许多,但是恰恰是开发效率,有不可否认的是.Net又比Java高出许多。不信你可以试试。

4.Java适合高手.Net适合初学者?

如果看到有这样想法的人必定是初学者,而当他们成为高手的时候,就是意识到这种想法是多么可笑。我之前遇到一个人,他说,C#也太简单了,就是拖拖控件的事情,一天半就可以学会。可笑的是我看他弄了一个礼拜都没有弄懂事件和委托。(我一直很怀疑他的理解能力)。要知道C#在Java原有的基础上加了很多Java没有的东西,Java有的C#也有。觉得C#简单的人都是看到了微软的VS的方便,觉得只是拖拖控件,当然这也正是.Net程序开发效率高的地方。你只能说它方便,不能说它简单,谁敢说他弄懂了.Net的反射机制,C#的指针你用过了么,不要以为你会用个List<T>就以为你掌握了泛型,泛型类你会用么。只能说C#很多地方和Java很像,但是你不能说会Java的学C#一天搞定,不然你永远是个菜鸟。

5.安全性的比较。

对于同样是运行在虚拟机底下,安全性必然可以得到保证。但是高安全就意味着灵活度的降低。没有指针意味着不用担心Java程序做出出格的事情,但是同时没有指针也意味着Java做不出出格的事情。这点微软聪明的地方就在于C#允许使用指针,可能很多人以为C#没有指针,其实那是因为你没有深入学习C#,只要在代码段前申明unsafe,就可以在这个代码段里使用指针。微软这样做使得将最终的决定权交给了程序员,反正我有,要不要用是你的事。

 

以上言论是我个人观点,我没有贬低Java的意思,我本身也是做Java的,但是客观的事实你必须承认,Java的很多优势在被.Net平台所取代。

如果说Java以前还是Sun的话,也许现在的成就不止这些。Oracle很多地方将Java给埋没了,Java以后和数据库的结合很好这个是必然的,毕竟Oracle是做数据库的,但是其它的很多地方将会很平庸。不要和我说Java 7又加了什么优化了什么,这一点小的更新和微软在.Net平台上所做出的比起来真的不算什么。