在做WEB服务器的时候,就一直在抱怨,我们的WEB服务器怎么就是那么慢,TPS总是上不去。一般谈及高性能的网络服务,总是不由自主的想到用C语言去开发服务应用,以确保性能。
难道Java语言的性能,就真的是远远不如C吗?
其实,大家都知道,JDK 5.0 6.0的绝对性能和C相比差距并不大,在很多评测里面,两者的差距不到一倍。而从语言特性上来说,Java语言,在抽象机制、安全机制、内存管理、并发控制和基础库上,和C语言相比,就像火枪和弓箭。
但是,就是这样,装备了大量堪称完美的高级特性的Java语言,却在基础应用领域内较少应用,明显落后于C语言。尤其在数据库、高性能网络服务、图形图形处理等领域。这其中的根本原因是什么??
我想到了一些原因:
1、人的问题。
能够用C语言写出优秀基础软件的人固然不多,能用Java写出来的人恐怕更少。Java有好几百万开发者,但是他们在干什么?大部分是去搞企业级开发、Web开发了,像这种bt下载网站 www.bt285.cn 很简单就可以实现了。但是有多少人真的理解Java的内存模型?有多少人能够熟练使用java.util.concurrent包中提供的那些工具?很多使用Java多年的人没有写过socket程序,不了解Java多线程的开销,不清楚如何进行性能诊断和调优,而这些在写基础软件的时候是必备的技能。大部分Java程序员在刚刚学会Java之后就转向Web开发,把主要精力花费在掌握一个又一个大型的、复杂的、具有厚厚的抽象层和华丽结构的frameworks上,不但对真实计算机体系结构不清楚,对于Java虚拟出来的那个计算环境也不清楚。因此,要把Java开发者编程转变成能够担负起下一代基础软件开发工作的尖兵,不但难度很大,而且必须花费足够的时间。
2、风格的问题。
这个问题我认为是最严重的。基础软件开发崇尚的是自由、直接、透明、简单、高效,反对繁琐华丽的设计,反对架床迭屋的层层抽象,反对复杂的结构和不必要的灵活性。而Java开发者多年来形成的设计风格与此格格不入,甚至可以说是对立的。Java在意识形态上是要面向企业应用软件的开发,所以特别强调架构,强调设计模式,强调标准,强调规规矩矩,强调高姿态,强调一种华贵的宫廷气质。在C中,你需要什么就做什么。而在Java中,你经常为了要干某件事,先new一个对象,然后以这个对象为参数new另一个对象,如此这般重复n遍,得到真正需要的对象,最后就是为了调用那个对象的一个方法。 这套繁琐的东西,对于基础软件开发来说,既不必要,也很难习惯。需要说明的是,这不是Java语言的问题,其实Java本身不必如此复杂、如此巴洛克。从语言本身来看,Java也可以是轻快直接的,也可是酣畅淋漓的。只不过十多年来几乎没有人这样用过,所以大家已经不知道,该怎么用Java写简洁程序?