Eric's Little Hut

Enjoy Programming, Enjoy Life

原创 有人说Java比C++快?收藏

新一篇: windows和linux的线程同步性能 | 旧一篇: Linux发行版推荐

    看到一篇让我不爽的文章:http://www-128.ibm.com/developerworks/cn/java/j-jtp09275.html
    Java的new应该和C++的object pool或者memory pool去比性能,而不是和malloc比性能。malloc更多的是一个操作系统API。

    实际上我觉得自己很鸡婆。Java比C++快这种论点,实在是只有傻瓜才会相信。但是现实是真的很多人相信这一点,而且我居然还跳出来解释。

    当然,我不否认:一个smart的java程序可以比一个foolish的C++快很多。
    比如,用java写:
    int add(int x, int y)
    
{
       
return x+y;
    }
 

    然后用C++写:
    int add(int x, int y)
    
{
      
for(int i = 0; i < 10000000; i++)
       
{
          string ss = "I am so foolish";
       }

       
return x+y;
    }
 

这两个程序,肯定是java的那个要快得多。

发表于 @ 2007年11月12日 15:49:00|评论(loading...)|编辑

新一篇: windows和linux的线程同步性能 | 旧一篇: Linux发行版推荐

评论

#wwwsq 发表于2007-11-12 16:14:35  IP: 60.12.88.*
wikipedia里面说:“在运行时将调用较多的方法内联(inline)到程序中来提高运行速度,这就是所谓的“动态优化”,而本地编译器是无法做到这一点的;这也是一些java代码比对应用C/C++等语言编写的本地代码运行的更快的原因之一。”

事实是:我接触到的大部分java程序都慢的象蜗牛一样。
事实是:在需要依靠inline来提高性能的程序里,程序员总是可以做得比JIT更好。
#njayyajn 发表于2007-11-13 20:34:56  IP: 222.210.30.*
哇 好高生的语言..
看不懂

我要好好学习 天天向上
#ITshu 发表于2007-11-13 21:45:53  IP: 221.192.237.*

支持java
#wwwsq 发表于2007-11-14 11:34:28  IP: 60.12.88.*
这个世界上最好的软件,基本上都是C/C++写的。因为伟大的软件作品需要长远的眼光和最大的可能性。而这恰恰是Java所缺乏的。Java适用的环境是写写商业逻辑,写写配置页面,Java天生只适合写那些比较中庸的程序。这不是说Java不好,而是Java不要试图在自己不擅长的地方吹牛皮。
#ggggqqqqihc 发表于2007-11-14 22:49:21  IP: 60.10.249.*
现在很多程序都会依赖一些程序库。如果Java的某个程序库比C++的相应的程序库实现的效率要高得多,那么Java的程序比C++的快也是很正常的事。
#qiudawei115 发表于2007-11-17 16:35:07  IP: 221.192.237.*
因为伟大的软件作品需要长远的眼光和最大的可能性。而这恰恰是Java所缺乏的
========
纯属扯淡
#wwwsq 发表于2007-11-26 15:34:24  IP: 64.62.138.*
to ggggqqqqihc:
你说的没错,如果C++的某个库写得效率不高,确实会导致整个C++程序变慢。不过这没有任何意义。因为首先Java的库更有可能写得低效率,其次C++很容易进行性能调整和优化而Java很难。

有意义的事实是:C++可以在任何想优化的地方进行充分的优化,而Java无法做到这一点,因为Java从根本上就不是为性能考虑的。

Wikipedia上有一些谬误:"Java often outperforms C++ in operations such as memory allocation and file I/O"
这纯粹是屁话。

分配内存和读写文件都是操作系统的事情,Java和操作系统API比性能,和C++有什么关系?

事实是:通过memory pool和async file IO,C++在使用这些API的时候性能比Java要高得多。
#wwwsq 发表于2007-11-26 15:47:42  IP: 64.62.138.*
补充一下,我并不是“唯性能论者”,也不是反对Java,实际上我很喜欢用C#写程序,C#的性能和Java是半斤八两。C#和Java在写一些对性能不是那么苛刻的程序的时候,还是不错的。因为C#和Java的程序容易写,开发成本低。
#wdx04 发表于2007-12-14 13:58:57  IP: 117.88.138.*
这篇文章里有几个Java vs C++的性能测试:
http://java.sys-con.com/read/45250.htm
基本上都是Java取胜。
而这篇文章里作者对C++程序作了修改,得出了相反的结论:
http://bruscy.multicon.pl/pages/przemek/java_not_really_faster_than_cpp.html
不过我拿他修改后的程序测试,在Win2003上用Intel C++ 10.0.27编译,methcall的性能还是只有Java的30%。后来我自己修改,把虚函数换成普通成员函数,也只提高到Java的63%。
不过Java程序程序占用的内存达到27MB,而C++只有1.5M,而且Java的server VM比client VM要快好几倍,所以我怀疑server VM用了缓存中间结果等非常规优化方式。
#wwwsq 发表于2007-12-15 11:34:00  IP: 125.119.232.*
很不幸的告诉你,那些例子都是不重视性能的C++代码写法。因为大多数程序那样写性能已经足够了。但是如果需要优化性能,那些C++程序都能被大幅优化。
比如:
http://www.kano.net/javabench/src/cpp/hash.cpp
不要使用sprintf(buf, "%x", i);而是改用itoa(buf, i, 16),把sprintf(buf, "%d", i);改用itoa(buf, i, 10)再把尤其愚蠢的strdup(buf)改为带memory pool的操作,另外再给hash table指定充分大的bucket count,甚至可以再把通用的hash map改为自己实现的简单hash映射。做了这些,你会发现,那个例子里的C++代码性能可以提高两三个数量级。

再比如:
http://www.kano.net/javabench/src/cpp/methcall.cpp
这个例子是测试虚函数,而我们都知道,在极端考虑性能的地方,是不会用虚函数的,而会考虑模板或者micro之类的替代方法。普通成员函数可以用inline优化,你试试inline关键字。然后你再试试把counter和counter_max加上register关键字。实在不行你还可以直接写汇编,直接写汇编可以避免编译器产生的空语句。Java编译的结果难道最终不是变成计算机认识的二进制代码吗?它凭什么比C++的程序快?

再比如:
http://www.kano.net/javabench/src/cpp/heapsort.cpp
和上面的一样,自己加register关键字。

那些java fans提出的对比例子,都是不注重性能的C++写法。这显得java fans心胸很狭窄。这对java没什么好处。

#wwwsq 发表于2007-12-15 13:33:27  IP: 125.120.160.*
另外,C++编译器有很多优化选项,请确认你都理解那些选项是什么意思。仅用-O2是远远不够的。你可以参考一下vs2005在编译release的时候,都有哪些优化的option可供选择。
#wwwsq 发表于2007-12-15 13:50:49  IP: 125.120.160.*
比如:
http://www.kano.net/javabench/src/cpp/objinst.cpp

只有不需要性能的地方,C++才会这样写。你可以试试重载一下class Toggle的new和delete操作符,给class Toggle设置一个static的vector<Toggle*> free_nodes成员,然后在new的时候先尝试从free_nodes里面取,delete的时候只是把对象指针放入free_nodes。
你会发现性能提高几个数量级。

这才是C++的优势,你可以选择,你可以在你想要优化的地方做任何你想做的优化。
#wwwsq 发表于2007-12-15 14:25:50  IP: 125.120.160.*
to wdx04:

不好意思,没看到你下面已经给出了反证。

好像我做了一些无用功呢。
#wdx04 发表于2007-12-17 11:59:13  IP: 117.88.138.*
重新研究了一下methcall。一方面,对这样只有循环和简单算术运算的程序来说,-O2已经是最佳优化选项,编译器把所有的函数调用inline到了main里,跟直接在main里写C风格代码执行效率完全相同,优化率100%。另一方面,剩下那30%多的性能差异是出在bool变量上,C++为了节省空间把bool变量当成单字节数据,而Java则用相当于一个处理器字的4字节来存放,这样C++代码会有部分寄存器延迟而Java没有。我修改了两边的代码,把bool变量换成int,!换成++运算再作测试,局面发生了逆转:C++由2.26s减少到1.55s,而Java反而由1.46s增加到1.73s。这说明Java确实针对bool数据作了特殊的优化,而一般情况下,还是C++更快。所以说Java Fans们用特例代码和过时的原始版C++代码比较性能是非常奸诈的。
heapsort稍微看了一下,不改代码时C++和Java运行时间都是1.25s,不过用C++ STL的sort才花0.27s,所以这个也没必要去优化了。
#mhoudg 发表于2008-05-26 16:56:58  IP: 10.15.3.*
C++是性能和易用性的一种平衡
java是以移植性和易用性为首要关心的
C++由于采用面向对象,性能很多时候不如纯C
真要说性能无限优化,那汇编比C还牛
可是有人会因为这个原因而 喜欢 用C和汇编么?

用的几乎都是不得已啊

楼主,看了你骂人的文字,我觉得你应该也同意以上观点吧
何必呢?java fans只是java fans,没必要这么喷人家吧
何苦搞得跟超女快男的fans似的

另外,楼主,如果否定一切其他语言的程序,那只能说明你对跨平台的需求低得可怜。脚本语言都有它们的可爱之处

何况这年头,好的代码是简单、易读,而不是运行起来最快的。除了极少数情况,程序语言的性能差别,基本都可以忽略。否则面向对象不会如此大行其道

PS。我喜欢Java,也喜欢C++,也喜欢Perl和shell。除非工作指定,否则我最喜欢用java编程,因为简单,如果需要分析文本文件和进行大量文件操作,我喜欢用Perl和shell,至于C++,能免则免,开发太麻烦了,换个操作系统又得重编译
#wwwsq 发表于2008-05-26 18:40:44  IP: 125.119.148.*
to mhoudg:
我并没有否认java的优点。
我并没有唯C++。

反而是像你这样的java fans,不能直面java的弱点。
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © Eric