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);
}
}
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");
}
}
可以看到C#的执行效率在Java的3倍以上。
如果说是因为.Net和Windows系统都是微软的产品,微软必然会对它进行应有的优化的话,那为了公平,我在公司的Linux服务器上进行了测试。
可以看到与之前的测试结果没有差别。
在这里我不对语言本身做什么令人争论的评论,我也不说什么语言之间的好与坏。(争论语言的好坏是初学者常干的事)
我只澄清以下几个经常被用来做语言之争的地方:
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平台上所做出的比起来真的不算什么。