posts - 30,  comments - 28,  trackbacks - 0
  “C++比Java快”,“Java运行于虚拟机上,当然要比C++慢”,“C++生成的是本地代码,直接运行于本地硬件上”,“速度比Java快多了”......
    这是我一年前学Java时的想法,为什么有那些想法?很简单,人云亦云罢了。既然那么多“高手”都这么说,那么多“精通”Java和C++的人都那么说,自然而然就信了。
    就这么过去了一年,对Java也越来越熟悉。自己依然是个初学者,而且相信不上升到布卢斯.艾克尔那个高度,就别想说自己精通C++和Java!
    虽说仍旧是初学者,却对国内那些“高手高手高高手”们的一些言论有了怀疑:Java不比C++慢!然而无论我在哪个论坛上,那个技术群里头发表这个观点,立刻会有一群“高手”来纠正,甚至有一次一个号称“一般不学语言,要学两个礼拜就能搞定”的“高手”很郑重其事地向我说明原理。当我了解到此人Java才学了一个月的时候,实在是无语了。还要一次一个高手批驳我,于是乎小心问了句,了解C语言里malloc和free函数的机制与否。此“高手”很不屑地告诉我:C++里的new 和 delete就能搞定,malloc早就没用了。又无语:也许他用的“C++"是他自己发明吧。
   只想问一句那些“高手”,看过近年来Java PK C++的一些精彩报告没?那些报告可是国外权威机构的文献啊!是通过实验得来的数据!
   还想问一句:你们说Java慢,是什么人,什么时候说的?那些言论的源头,大多数是Java 1.2时代以前的啊。
  说Java比C++慢的人,是否真的亲自写过测试代码?(虽说我的代码不能算精确,但也好歹做过近十次的实验,用了好几种不同的JVM或Cpp编译器,Java大获全胜)
  说Java比C++慢的人,是否了解JVM的运行机制?(我只能说我了解一些罢了)
  说Java比C++慢的人,是否有拿得出手的报告或实验?(可惜,从来没遇到过)
  说Java比C++慢的人,请去学习一下唯物论!
  而且为什么只有在国外才有那么多人认为Java快,只有国外的科研机构才花费时间和精力去做那些被很多国内程序员斥为“没用”(和好多程序员聊天时,他们这么认为)的实验?是中国的程序员都是天才么?还是中国的计算机业太“先进”了,不需要去关心这些东西呢?
  实在是发人深省!!!
   
posted on 2006-06-29 06:22 murainwood 阅读(5164) 评论(19)  编辑  收藏 所属分类: 随感


FeedBack:
# re: 一点小感想:为什么那么多人说Java慢???
2006-06-29 11:09 | fjchenq
其实C++是用new 和 delete创建与销毁对象的。  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???
2006-06-29 11:15 | fjchenq
为什么说java比c++慢。

有一个很简单的事实说明,为什么java没有用在开发操作系统、驱动程序等等底层的程序上。

如果说java不比c++慢,那只有一个条件下,那就是内存足够大,java的实现把许多东西都放入内存中。这就是为什么delphi在256M内存可以跑的很流畅,而jbuilder在512M内存下,还跑得相当慢。

如果你有足够大的内存,开发java程序也很快呀。
oracle 8i和oracle8两个软件其实相当不大,但是oracle8i对内存要求高得很多,为什么呢?因为oracle8i有一部分用java开发的。

如果你不相信这点,oracle10g安装到256M内存的电脑试试,我相信你会吐血。我曾经试过,花的一个下午还没有安装结束。

总得来说,如果你开发web程序等,推荐用jsp和.net技术。这两种技术相对来说比较简单。





  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???
2006-06-29 14:30 | murainwood
@fjchenq
如果你了解C++的new 和 delete的底层机制,就会知道
他们就是调用malloc和free来实现的
C/C ++里面的内存分配和销毁,实质上全是malloc 和 free.
C++为了安全的考虑,“包装”了这两个函数。在STL则是更进一步“包装”
  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???
2006-06-29 14:39 | murainwood
Java的就是以内存换速度的
现在的内存好像已经蛮便宜了吧?再者,我想现在你也不会用256M内存的机器来使用oracle10。
C语言是必不可少的(操作系统,游戏引擎),但是C++的地位却有些“尴尬”,不是么?STL库让曾经C++达到巅峰,然而巅峰之后?曾经有段时间我非常喜欢STL,然而STL的语法风格实在是欠缺优美
C++/CLI被标准委员会否决,实在太让人失望了。  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???
2006-06-29 14:47 | murainwood
Java无法进行底层开发是因为其运行机制的缘故罢了,说“Java因为速度慢而无法进行底层开发”,这句话没有逻辑可言。不能因为Java无法开发操作系统而来说明Java的速度慢。
而且底层开发C用得更多,极少有操作系统用C++写的。



  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???
2006-08-01 06:02 | murainwood
Java的速度快是相对的,不是绝对的。换而言之,Java的速度慢也是一样道理。效率~~  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???[未登录]
2007-12-29 17:28 | jimmy
java里使用垃圾回收机制的策略管理内存,这样内存得不到及时释放,导致运行速度很慢,这是主要原因吧,但这种方式使程序员不用自己管理内存,很安全  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???
2008-03-13 12:04 | Jonlee
Why Java Will Always Be Slower than C++
by Dejan Jelovic

为什么Java永远比C++慢?

耍过Java程序,或者用Java码过程序的人都晓得,Java要比用C++写成的原生程序要慢。这是咱用Java时已经承认的事实。
  不过,很多人想要说服我们说这只不过是暂时的,他们说Java从设计上来讲并不慢,相反,只是现在的JIT实现相对比较嫩,有很多能优化的地方JIT并没有优化到,拖了后腿。其实不然,不管JIT们多牛,Java永远要比C++慢。
  
  我想说...
  宣扬Java不慢于C++的人往往是觉得,(语法)严格的语言,可以让编译有更大的优化空间。因此,除非你想做人肉编译器优化整个程序,否则通常都是编译器做得更好。
  这是真的。在数值计算领域,Fortran仍然胜于C++,的确因为它更严格。不用担心指针瞎搅和,编译器可以更安心地优化。C++想打败Fortran的唯一办法,就是好好设计一个像Blitz++那样的库。

  测试...
  Java可以跟得上C++的地方,就是基准测试。计算起第N个斐波纳契数,或者运行起Linpack,Java没理由不跟C++跑得一样快。当所有的计算都放在一个类里,并且只使用基本的数据类型,比如说int或者double时,Java编译器的确能跟得上C++的脚步。

  事实...
  当开始在程序中使用对象的时候,Java就放松了潜在的优化。这一节会告诉你为什么。

  1. 所有的对象都是从堆里分配的。
  Java从栈里分配的,就只有基本数据类型,如int,或者double,还有对象的引用。所有的对象都是从堆里分配的。
  当有大量语义上是一回事的对象时,这不成问题。C++同样也是从堆上分配这些对象。但是,当有值语义不同的小对象时,这就是一个主要的性能杀手。
  什么是小对象?对我来说,就是迭代器们。在设计中,我用了很多迭代器。别人可能会用复数。3D程序员可能会矢量或者点类。处理时间序列的人可能会有时间类。使用这些类的人,无一例外地讨厌把不费时间的栈上分配换成花费固定时间的堆上分配。假如把它放在一个循环里,就变成了O(n)对0了。如果再加一层循环,没错,又变成O(n^2)对0了。

  2. 大量的转换。
  得益于模板,好的C++程序员甚至可以写于完全没有转换的牛程序。不幸,Java没有模板,所以Java代码总是充满了转换。
  对于性能,它们意味着什么?呃,在Java里所有的转换都是很费时的动态转换。多费时?想想你可能会怎么样实现转换的:
  最快的方法就是,给每一个类赋值一个序号,然后用一个矩阵来描述任意两个类是否相关的。如果是的话,需要给指针加上多少的位移才能进行转换。这种方法的伪码看起来应该是这样的:
DestinationClass makeCast (Object o, Class destinationClass) {
Class sourceClass = o.getClass (); // JIT compile-time
int sourceClassId = sourceClass.getId (); // JIT compile-time

int destinationId = destinationClass.getId ();

int offset = ourTable [sourceClassId][destinationClassId];

if (offset != ILLEGAL_OFFSET_VALUE) {
return <object o adjusted for offset>;
}
else {
throw new IllegalCastException ();
}
}
好一堆代码。这只是一个简单的情景——用矩阵来表示类的关系浪费了一部分内存,没有哪个成熟的编译器会这样子做。他们会使用map或者遍历继承树,这样会变得更慢。

  3. 攀升的内存占用。
  Java程序储存数据占用的内存大概是相当的C++程序的两倍。原因如下:
  1. 启用了垃圾收集的程序一般都比不使用垃圾收集的程序多花50%的内存。
  2. 本来C++里在栈上分配的对象,到了Java就在堆上分配了。
  3. Java对象比较大,因为所有的对象都有一个虚表,还要加上对(线程)同步的原生支持。
大的内存映像让程序更大概率被放到磁盘的交换区去。没有什么比交换文件更慢的了。
  4. 缺少更细致的控制。
Java原来就是作为一种简单的语言来设计的。很多在C++里让程序员控制细节的特性在Java里都被一脚踢开了。
  比如说,在C++里可以改进引用的位置(?)。或者一次申请和释放很多个对象。或者用指针耍一些小技巧,更快地访问成员。
  5. 没有高层次的优化。
  程序员处理高层次的概念。而编译器处理剩下的低层次概念。对于程序员来说,一个叫Matrix的类就代表了比一个叫Vector的类更高层次的概念。而对于编译器来说,这些名字都是符号表的一个入口。他们只关心类里面有哪些函数,函数里面有哪些语句。
  这样想一下,比如说要实现一个exp(double x, double y)函数,计算出x的y次幂。对于一个编译器,它能只看一下这个函数,然后指出,exp(exp(x, 2), 0.5)可以优化成x自己吗?当然不行。
  编译器能做的优化只是语句层面的,而y是在编译器里面的。即使程序员知道两个函数是对称的,可以把它们都消去,或者函数的调用顺序只是相反的,除非编译器能只瞄一下语句,然后指出来,不然优化是不可能完成的。
  所以,如果想要完成一个高水平的优化,必须存在某种方法,可以让程序员来告诉编译器优化的规则。

  没有哪个流行的程序语言/系统可以做到这点,至少已知的方法,比如微软承诺的智能语言,都不能。即便如此,在C++里可以用模板元编程来实现对高层次对象的优化。临时消除,部分求值,对称函数调用的消去,和其它可以用模板实现的优化。当然,不是所有的高层次优化都可以这样做。并且实现这些东西相当麻烦。但是大多数都可以完成,有人已经用这些技术实现了好些时髦的库。

  不幸的是,Java没有任何元编程的特质,因此在Java中不会有这种高层次的优化。
  所以...

  由于存在这种语言特性,Java不可能达到C++这种速度。这相当程序上暗示了,对于要求高性能的软件和竞争激烈的COTS舞台上,使用Java不是一种明智的选择。但是因为它和缓的学习曲线,它的容错,和它庞大的标准库,所以适合开发中小型自用和定制软件。

  附记...
  1. 有人向James Gosling(谁?google之...)提交了很多可以改进Java性能的语言特性。文本在这里。不幸的是,Java语言已经有四年没有改动过了,所以看起来这些提议似乎不会在一夜之间被实现。

  2. 最有可能往Java里加入泛型的是Generic Java。又很不幸的是,GJ只是通过在编译时把所有类型信息去掉来支持泛型。所以最后面执行环境看到的,仍然是缓慢的转换。

  3. 垃圾收集的FAQ包含了关于垃圾收集慢于定制分配器的信息(上面第四点)。

  4. 这里是一篇宣称垃圾收集比栈分配的快的文章。但是它的要求是物理内存必须是程序实际需要的内存的七倍之多。还有,它描述的是一种stop-and-copy(是不是那种执行到一半,然后停下来,把内存拷到另外一块内存,同时清除垃圾的那种方法?),而且还不是并发的。

  反馈...
  我收到很多关于这篇文章的反馈。附上一些典型的评论,还有我的回答:

  “你还忘记了指出在Java里所有的方法都是虚方法,因为没有人会加上final关键字。”
  事实上,不使用final关键字不是问题的关键所在,使用者才是。同时,虚函数也没有问题,但是却失去了优化机会。自从JIT们知道怎么样内联虚函数,这就变得不那么显著了。

  JIT可以内联虚函数,所以Java可以比C++更快。
  C++也可以使用JIT编译。不信的可以看看.NET的C++编译器。

  到最后的时候,速度并不重要。电脑浪费了大部份时间在等待用户输入。
  速度仍然很重要。我仍然在等我的笔记本启动起来,我在等我的编译器停下来,我还要等Word打开一个超长的文档。
  我在一个金融公司工作。有时候我必须对一个很大的数据集进行模拟。速度在这种情况下都很重要。

  有些JIT可以在栈上分配一些对象。
  当然,一些。

  你的转换代码看起来很丑。可以在类的继承层次上检查类。
  首先,这样只比矩阵查找快一点点而已。
  第二,这样只能查找类,类只占多少?低层次的细节往往是通过接口来实现的。

  哈,那么我们都应该使用汇编?
  不是的,我们都要使用对业务有用的语言。Java提供了庞大的标准库,让很多任务变得容易,因此Java是伟大的。它比其它所有的语言更容易移植(但并非100%可移植——不同的平台有不同问题)。它具有垃圾收集机制,简化了内存管理,同时也让某些构造如闭包可实现。
  但是,同时,Java和所有的语言一样,也有瑕疵。在值语义的类型上缺少支持。它的同步并不是很有效率。它的标准库建立在异常检查之上,把实现拖进了接口。它的性能可以更好。它的数学库有些恼人的问题。诸如此类。

  这些缺憾都是大问题吗?看你用它做什么。因此,在几种语言里,连同它的编译器以及可以选择的类库里选择对你的工程有利的一种。
  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???
2008-03-13 12:05 | Jonlee
上面这篇文章可不是中国人写的哦  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???
2008-05-23 13:07 | :
:  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???[未登录]
2008-05-27 12:53 | feng
mark, 不懂java. 不过对C++不用于编写操作系统有点不明白? C++是C的超集,提出面向对象编程的思想, 为什么不可以用C++编操作系统? C的语法C++都支持不是吗?? 用C编写操作系统想起来都很累. 是不是C++的程序编译之后不如C的快?  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???
2008-11-19 16:47 | 路人
我一直都很喜欢java
我不是高手
但是我比较相信thinking in java 毕竟是全球最受欢迎的java著作
thinking in java里讲到java比c++慢
虽然我没做过实验 但我还是比较相信这本书的  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???
2008-12-08 21:38 | murainwood
影响Java性能的一个重要原因--垃圾收集。
仅仅是原始类型的重复计算,确实无法比出快慢。
我的团队今年年初做了一个项目,就涉及到这个问题。32位JVM有效管理的Heap,最好不要超过1G。不然一次Full GC,真能把应用给阻塞住。
两年前写的东西,现在看来,太过于幼稚啦。  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???[未登录]
2009-05-27 18:10 | aaa
做编程的门类很多 不同平台上 不同性质的应用
你如果完全了解所有门类
你就应该知道为何java慢了  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???
2009-06-22 15:46 |
Java桌面应用慢到死!垃圾一样的东西  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???[未登录]
2009-12-15 17:02 | 光光
c++存在一个函数表,访问一段代码至少要访问两次内存,所以在对性能要求很高的操作系统内核上不适宜使用  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???
2011-08-10 09:27 | 嗷嗷嗷
还是那句话,你下结语评论的时候,不要忘记前提。
如果在微观上面讲,做一个应用,java的每次损耗是6ms,而C++是2ms,那么这是看不出来,在人的感觉也不明显,因而判定Java不必C++慢。
但从宏观上面来讲,如果你的应用是几百万 上千万的量,那么这些积累起来就是比较大的损耗了。这就是Java为什么通常应用集群技术等等。
而且一味的扩大内存也有瓶颈,为什么,在桌面级别应用上面,如windows上面会page内存到磁盘,别忘了 实际磁盘速度这10几年其实并没有太多变化,仍然大大跟不上内存,所以一般太大的程序,长时间不使用,一旦最大化,就要等待很久时间。比如游戏等等。
其实要说Java慢,并非语言本身,而是不同的机制。这么多年Java在算法上面改进了多少?可是本身硬伤是不可能有太多改变的,所以只能靠机器的提升。如果你是C++程序员,你要掌握比Java更多的处理内存的方法和技术,带来的是可以稍微低端的计算机可以跑。
  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???[未登录]
2013-03-13 15:41 | aa
莫名被最后一句话戳中笑点@fjchenq
  回复  更多评论
  
# re: 一点小感想:为什么那么多人说Java慢???[未登录]
2015-10-06 12:05 |
.class文件也是一些指令吧,执行.class文件的时候要进行一次指令搜索,这一层是搜索到的指令又要调用一层操作系统层的指令,而C++少了第一次的指令调用,时间就是这么多出来的 。当然可能还有其它原因。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2006年8月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

如果真的给你一片天,你敢不敢要?

常用链接

留言簿(3)

随笔分类

随笔档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜