阅读更多

28顶
7踩

编程语言

原创新闻 JAVA比C++更快?

2008-04-07 15:15 by 见习编辑 Eastsun 评论(22) 有18485人浏览
首先:我必须承让,我取JAVA比C++更快?为标题是有点故意吸引眼球的意思.
   事实上在本文中,我的主要目的不是为了证明或否定JAVA比C++更快这一个结论(事实上标题中的"?"已经隐含了这一点),而是通过引用几位JAVA大牛的文章深入JIT与Hotspot的实现原理,来说明为什么JAVA可以比C++更快.当然,在你有你自己的结论之前,我希望你能仔细看一下文中引用的几篇文章,而不是想当然.
    注意:文中大部分内容或结论是引用别人的文章,有一些是我自己的看法,文中用绿色标出.
   1.静态编译与Hotspot动态编译

    我们知道,C++相对Basic等解释型语言,之所以性能上有明显的优势,主要是因为C++在运行的时候已经通过编译器编译为二进制的机器语言,并且现代的编译器可以在编译的时候做大量的最优化处理;而Basic等解释型语言运行的时候是通过解释器一步步的解释运行,这样中间隔了一个解释器,速度当然就慢了.
    而JAVA刚出世的时候采取的也是解释执行的方法(现在某些低端设备上的JRE还是解释执行),只不过它比Basic更聪明一点:不是直接解释JAVA源代码,而是先将JAVA源代码编译为一种平台无关的JAVA字节码.这样执行速度可能会比Basic快一些,但相对C++的执行效率还是有很大的差别.
    然后,JIT(just-in-time)编译器出现了.JIT编译器在每段代码执行前进行编译,编译的结果为本地静态机器码,执行速度有了质的提高.到这儿,我们可以比较一下C++的静态编译与JRE的JIT静态编译:一个是在运行前将代码编译为机器语言,一个是在运行时将字节码编译为机器语言,相比而言,JAVA的JIT编译器还是显得笨一点,预先一次编译比运行时再编译当然要好了.但对于JAVA,为了跨平台,这样做是必须的.
    JIT静态编译器相对解释执行已经有了很大的提高,但是性能仍然和C++有很大的差距.对一段程序,一名优秀的程序员是如何来改进运行速度的呢?首先,他不会傻到把所有的代码都来优化,他会观察、思考到底哪段代码对整体性能影响最大?然后集中精力来优化这一段代码.按照经验,整个程序 10%-20%的代码,会占据 80%-90%的运行时间.用这种方法,在同样的时间、付出同样程度的努力后,这名优秀的程序员使整个程序的性能得到了很大程度的优化.HotSpot引擎,就是模仿人工的这种方法进行优化的.在程序运行的开始,Java代码仍然解释执行,但HotSpot引擎开始进行采样(Profiling).根据采样的结果,决定某段程序是占用较多运行时间的,就认为它是“HotSpot”,它也就是目前程序的瓶颈,引擎开始启动一个单独的线程进行优化.因为不象原始的 JIT编译器那样无差别的编译所有代码,HotSpot引擎可以集中精力来对HotSpot代码进行深度优化,这样这部分代码执行起来更加迅捷.


   2.让我们来看看JIT/Hotspot的工作

    一般来说,JVM或JAVA的标准API没有提供让我们观察Hotspot工作(产生机器码)的接口.所以以前我们只能猜测Hotspot在背后究竟做了那些事情,我们写的JAVA代码被它弄成什么样子了.
    不过现在好了,Java SE Update N这一系列因为处于开发状态,为了方便debug,这些JVM提供了一个运行参数:PrintOptoAssembly,你可以通过如下方式:
引用

java -XX:+PrintOptoAssembly -server -cp . Main

运行你的程序,就可以看到这些JAVA程序在编译为机器语言之后的样子.
    Kohsuke Kawaguchi做了一些测试,他在博客深入JAVA生成的机器码(Deep dive into assembly code from Java)中进行了一些展示与讲解.并且他对JVM生成的优化代码表示赞赏:
引用
All in all, modern JVMs seem pretty good at generating optimal code. In various situations, the resulting assembly code is far from the straight-forward instruction-by-instruction translation.


     JAVA之父James Gosling在他的博客Hotspot performance中描述了JIT/Hotspot生成的机器码有以下优点:
引用

   ◇ Really aggressive inlining
   ◇ Even storage allocation & initialization gets inlined - new T() really is as efficient as C's alloca() (and it beats the pants off malloc())
   ◇ Careful management of cache prefetching
   ◇ Deep understanding of variablity between the flavors of x86 machines
   ◇ Loop unrolling with warmup/cooldown
   ◇ "theorum proving away" of array index checks (and many other things)
   ◇ much cleverness with locks





3.JVM的执行效率可以比C++更高?

     事实上,我认为现在将JAVA与C++比较执行效率没什么太多的意义了.我的意思是,JAVA已经足够快了.而且说实话,经过学C++再学JAVA之后,我已经对C++这门语言避而远之了.
     不过为了满足一下某些人的八卦精神,我这里给出几个JAVA与C++的比较:
     The Java is Faster than C++ and C++ Sucks Unbiased Benchmark
     FreeTTS - A Performance Case Study
     Performance comparison C++, C# and Java
     八卦之后,我们来看看为什么JAVA能过这么快呢?
     同样,给出几篇介绍JIT/Hotspot工作原理的文章:
     JIT Performance: Defying Physics?
      Can JIT'ed Code be Faster than Hardware Accelleration


28
7
评论 共 22 条 请登录后发表评论
22 楼 liumingtong 2011-06-13 10:15
linliangyi2007 写道
看不下去了,又是语言之争!!有意思嘛?!
C++也好,Java也好,哪个是中国人发明的??
争来争取都不觉得会被老外耻笑!

中国有个易语言..
21 楼 海阔天空一路是蓝 2011-03-07 15:50
...
20 楼 java程序员 2009-09-19 00:21
troyconder 写道
没意义 楼主 最主要的还是看应用领域 Java无法无缝结合系统内核 这点很不爽 只能用C++了啊 注:我也是靠Java吃饭的 但是也非常喜欢c/c++ 希望都能越来越好吧 语言纷争永无止尽啊

19 楼 troyconder 2009-03-18 10:51
没意义 楼主 最主要的还是看应用领域 Java无法无缝结合系统内核 这点很不爽 只能用C++了啊 注:我也是靠Java吃饭的 但是也非常喜欢c/c++ 希望都能越来越好吧 语言纷争永无止尽啊
18 楼 liigo 2008-04-10 23:06
你这篇也没什么营养,人云亦云罢了
17 楼 galaxystar 2008-04-10 11:46
我只顶 c
16 楼 Unmi 2008-04-10 11:15
向介绍给大家一些关于JIT/Hotspot方面的知识
可是你自己搬起“JAVA比C++更快?”就是有意在砸自己的脚,你揭开的锅,让从家把矛头指向你也是你意料之中的事,也许还是你期望见过到这样一种场景。
15 楼 pdreamer 2008-04-09 23:15
优化过的java有可能比c++快,但都优化好,那是龟兔赛跑,跑在jvm上和跑在硬件上不用比了,我java用的比C++多,java开发起来比c++方便,
14 楼 JavaInActoin 2008-04-09 17:24
越来越快就好,胜任需求就好,到底谁快,无所谓的啦
13 楼 55925384 2008-04-09 15:23
作者有点逻辑混乱
12 楼 Frederick 2008-04-09 14:36
感觉文章有点东拉西扯,不知道到底要说java比c++快呢,还是要说java有个JIT和HotSpot技术。
11 楼 linliangyi2007 2008-04-09 12:57
看不下去了,又是语言之争!!有意思嘛?!
C++也好,Java也好,哪个是中国人发明的??
争来争取都不觉得会被老外耻笑!
10 楼 Eastsun 2008-04-09 10:11
fins 2008-04-09 00:58 写道

这个算是新闻? 我觉得属于技术类文章吧
不过不管怎样我都受教了 谢谢lz


呵呵,其实里面关于Java SE Update N的JVM参数,以及James Gosling的观点,都算是新闻了.
不过对于技术新闻,我喜欢把相关的信息综合一下,让大家能对相关的技术也有所了解.
9 楼 Eastsun 2008-04-09 10:05
ray_linn 写道
自己的材料难道也不看清楚一下?Java 1.4比Java 1.5要快一些,但都远逊于C++.

首先,文章的开头我已经说了
引用

我的主要目的不是为了证明或否定JAVA比C++更快这一个结论(事实上标题中的"?"已经隐含了这一点),而是通过引用几位JAVA大牛的文章深入JIT与Hotspot的实现原理,来说明为什么JAVA可以比C++更快.


因此我的主要目的不是为了让大家八卦(当然不排斥八卦),而是想介绍给大家一些关于JIT/Hotspot方面的知识.
因为这种问题由于每个人的偏见,看待的角度不一样,是很难得到一个大家都接受的结论.
至于每个人自己有什么见解,完全可以发表,但不要将矛头指向我.


至于"自己的材料难道也不看清楚一下?".
我想,新闻的主要标准之一就要在于客观公平.
所以找材料的时候我特意找了这几个着重点不太一样,结果也不太一样的测试.
网上说JAVA比C++快的测试结果比比皆是,如果我全用这些数据,估计C++er也不会服气,这对大家获得一个全面客观的信息也没什么好处.

对于那些只想看到一种声音的人,可以去看这里多家权威机构、几十篇权威证据证明:Java比C++更快。
显然,这样的帖子并没有多少营养.
8 楼 ray_linn 2008-04-09 09:35
而且最严重的问题出现在计算和数组方面:
array : Java比C++慢了47%,(1703-1156)/1156
trig.math: Java比C++慢了 1076%,(42843-3241)/3241  简直是龟速了

这充分说明了Java难以胜任科学计算。
7 楼 ray_linn 2008-04-09 09:23
PS:如果牵涉到Sin Cos之类的运算,Java还会比C#慢一大截。
6 楼 Unmi 2008-04-09 09:22
要分清,如果是 Java 写的企业应用,作为服务的 Java 程序确实能用 JIT,HotSpot来优化。但如果只是桌面程序的话,那岂不是每次都 JIT,还不慢了,应分清领域。
其实我就后悔用C++做的项目太少,在跨平台的桌面应用我偏爱于 C++,可用 wxWidgets,QT, 我宁愿选择一次编写到处编译,而不是到处调试
5 楼 ray_linn 2008-04-09 09:22
从你的材料Performance comparison C++, C# and Java随便找到这句话大概是不是说Java比C++快吧?
Cpp is the fastest, except the STL "hashmaps" test is a lot slower, maybe someone can take a look at the source code

几个比较中,C++都远胜于Java,除了List和Hashmap之外(作者推断是实现代码的问题)。而且在内存表现中,Java是最次的一个。

Maximum memory usage:

Java - 163 MB
C# - 111 MB
Cpp - 98 MB

自己的材料难道也不看清楚一下?Java 1.4比Java 1.5要快一些,但都远逊于C++.
4 楼 fins 2008-04-09 00:58
这个算是新闻? 我觉得属于技术类文章吧
不过不管怎样我都受教了 谢谢lz
3 楼 Joo 2008-04-09 00:43
能解释下为什么现在C++还存活的理由么?既然Java相对于C++来说有了如此大的进步
选择一个语言可能除了速度之外,还有更多需考虑因素吧:历史遗留,平台异构,网络处理能力,底层处理能力,开发项目性质

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 软件开发人员创业做什么方向好?自己的疑问!

    做软件也有十几年了,一波一波的“IT行业的冬天”不断的涌来。 在这种情况下,自己创业走什么方向,一直是我在思考的问题。 写这篇文章不是为了给别人看,而是提醒自己,哦,你当时有过这种想法,现在有没有新的更好的想法呢? 现实的情况是: 1、经济上的冬天,造成小企业的大量倒闭,很多中小企业被迫走合并规模化的道路。 2、个人电脑,上网人数在不断增加,中国的网民超过了美国,除了企业和网吧,但真正能...

  • 小型软件公司的出路

       在我们身边,你会发现存在着很多小型软件公司,他们少则几人,多则几十人。他们在苦苦地经营着,有的不断壮大,有的也在不断衰弱。但是随着中小型企业对信息技术重视程度的提高,小型软件公司也会有更多的机遇。那么这些小型软件公司如何寻求自己的出路呢?[产品定位不容忽视]    有的小型软件公司在发展的过程中没有产品定位,总想着只要是软件项目就接,如果干不了,就转包给其他公司。实际上这样的想法对公司没多少

  • 如何创业

    一次成功的创业建立在以下三个条件上:优秀的合伙人,确实有需求的产品,以及尽可能少的启动资金。绝大部分创业失败是因为它们缺少了以上这些条件中的某一项,而那些完全具备这三点的创业往往会取得成功。让人欣慰的是,当你认真考虑它们的时候,这三点条件都是可行的,虽然可能有一点困难。鉴于成功的创业应该会让创始人富有,我们可以得出结论:富有的生活是可以实现的,只是有一点困难。如果说在创业方面只有一点我想要

  • 揭秘开一个软件公司、网络科技公司流程

    这两天我所在的网络科技公司进行了为期两天的搬家,从城市人口不够密集的地方搬迁到了市中心地带,我目睹了搬家的全程,假如日后自己想开网络公司可以作为借鉴.整个搬家流程跟从头开一个wang l ...

  • 怎样开软件开发公司?

    相信大多数的步伐员都和我有一样的想法,积聚了一定的资金后拥有自己的公司,而本人做步伐员的最终目的就是这个,但现在苦于只懂以点技术,其余几乎一无所知,各位兄台,假如你们也和我有一样的想法,请给我一点发起,我愿意贡献所有分数。     1、所在:在北京或者广州。     2、业务该如何开展。     3、人员任用方面如何做。     其他可能会碰到的问题,恳请您的宝贵经验和发起。

  • 程序创业:小型软件公司如何做大(转)

  • 软件项目外包平台:公司刚刚创业,人手不够怎么办?外包吧

    CSTO-全球最大的中文软件外包和项目交易平台http://www.csto.com国内外十大项目外包平台1.猪八戒网网址:www.zhubajie.com特点:以国内项目为主,主要为页面设计,logo设计等小型项目为主。2.任务中国网址:www.taskcn.com特点: 是一个为消除劳务信息的地域差异、为广大有能力威客们建立的2010年后主流工作平台之一。3.软件项目交易网网址:www.sxs

  • 软件公司创业完全手册[二]

    技术篇   如果说国际化大公司一般是把追求高额利润和市场占有率作为自己的目标,以客户为导向进行运营,那么新创业的企业则以追求技术创新为目标,以技术为导向。很大程度上许多人之所以会盟生创业的梦想,便是之于对一种全新技术前景的看好以及自己在这方面的优势。   很多创业者来自于以前所在公司的技术人员。   Cisco有一个对手叫Juniper,这家小型公司的Founder(创始人)正是Cisco的核心技

  • 软件公司商业模式【csdn摘抄】

    有一种公司是靠关系拿订单,有固定成本和固定收入,一减就是最终盈利。这样的公司是需要依靠人际关系,但不是所有公司都可以做到,所以公司要采用什么商业模式很重要。很多公司都是技术走向,根据自己公司已有的技术去做,其实这样是有问题的。一定要先看自己的公司定位是什么,目标用户群在哪里,看一下市场需求。 第二点是通用型的公司一定会走向消亡。由于这一块是高度竞争的市场,只能够养三大五大,其他的只能在周边痛

  • 中小型软件企业的生存之道

    转载于:https://my.oschina.net/u/3973239/blog/3005314

  • 初创软件公司如果快速步入盈利轨道

      在万众创业的今天,很多年轻人创业时选择了投入少,但又容易创造神话的软件和互联网行业。那么初创的软件公司,尤其是小软件公司如何快速步入盈利轨道,生存并发展起来呢?下面,我就此问题谈下我的看法。 如果你的产品具有颠覆性,且技术难以超越,直击市场痛点,那么这篇文章对你没有什么意义了,你不想赚钱都难,也根本不需要太多推广;如果有客户资源,或者是关系硬,那么这篇文章也和你没有关系了,原因你懂的;...

  • 软件公司的生存之道

     一个朋友是国内某著名高校哲学系毕业的,很有哲学家的气质,认识他的人都说这个人很有头脑,大事小事都有一套理论做基础,挺有意思。后来他不知动了哪根脑筋,竟然不可思议开起了一家电脑公司,业务挺全面的,从电脑培训、硬件销售到软件开发、网吧,公司的规模很大,也很分散,不同的部门在不同的街道上。最近,他开的电脑公司荣获我市消费者投票所评的“软件开发服务最佳单位”,并被当地政府指定为企业信息化软件开发指定单位

Global site tag (gtag.js) - Google Analytics