JAVA比C++更快?

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

[color=blue][size=medium]2.让我们来看看JIT/Hotspot的工作[/size][/color]
[size=small]
一般来说,JVM或JAVA的标准API没有提供让我们观察Hotspot工作(产生机器码)的接口.所以以前我们只能猜测Hotspot在背后究竟做了那些事情,我们写的JAVA代码被它弄成什么样子了.
不过现在好了,[color=red][url=http://download.java.net/jdk6/binaries/]Java SE Update N[/url][/color]这一系列因为处于开发状态,为了方便debug,这些JVM提供了一个运行参数:[color=red]PrintOptoAssembly[/color],你可以通过如下方式:
[quote]
java -XX:+PrintOptoAssembly -server -cp . Main
[/quote]
运行你的程序,就可以看到这些JAVA程序在编译为机器语言之后的样子.
Kohsuke Kawaguchi做了一些测试,他在博客[url=http://weblogs.java.net/blog/kohsuke/archive/2008/03/deep_dive_into.html]深入JAVA生成的机器码(Deep dive into assembly code from Java)[/url]中进行了一些展示与讲解.并且他对JVM生成的优化代码表示赞赏:
[quote]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.[/quote]

JAVA之父James Gosling在他的博客[url=http://blogs.sun.com/jag/entry/hotspot_performance]Hotspot performance[/url]中描述了JIT/Hotspot生成的机器码有以下优点:
[quote]
◇ 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

[/quote]
[/size]


[color=blue][size=medium]3.JVM的执行效率可以比C++更高?[/size][/color]
[size=small]
事实上,我认为现在将JAVA与C++比较执行效率没什么太多的意义了.我的意思是,JAVA已经足够快了.而且说实话,经过学C++再学JAVA之后,我已经对C++这门语言避而远之了.
不过为了满足一下某些人的八卦精神,我这里给出几个JAVA与C++的比较:
[url=http://kano.net/javabench/]The Java is Faster than C++ and C++ Sucks Unbiased Benchmark [/url]
[url=http://research.sun.com/techrep/2002/abstract-114.html]FreeTTS - A Performance Case Study[/url]
[url=http://www.tommti-systems.de/go.html?http://www.tommti-systems.de/main-Dateien/reviews/languages/benchmarks.html]Performance comparison C++, C# and Java [/url]
八卦之后,我们来看看为什么JAVA能过这么快呢?
同样,给出几篇介绍JIT/Hotspot工作原理的文章:
[url=http://weblogs.java.net/blog/mlam/archive/2007/02/jit_performance_1.html]JIT Performance: Defying Physics?[/url]
[url=http://www.theserverside.com/news/thread.tss?thread_id=44296]Can JIT'ed Code be Faster than Hardware Accelleration[/url]
[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C和Java都是非常流行的编程语言,并且都有广泛的应用和发展前景。但是,它们的应用场景和用途有所不同。 C是一种系统编程语言,用于编写操作系统、设备驱动程序、嵌入式系统、游戏引擎等底层应用程序。由于C的执行速度非常,因此它在需要高性能和内存效率的应用程序中非常受欢迎。 Java则是一种广泛用于开发企业应用程序和Web应用程序的高级编程语言。它通常用于开发大型、复杂的应用程序,因为它具有更好的可维护性和可扩展性。Java还具有“一次编写,到处运行”的特性,即Java程序可以在不同的操作系统上运行,这使得Java成为跨平台开发的首选语言之一。 因此,从发展前景来看,C和Java都有很好的发展前景,但在不同的领域中有不同的应用和优势。如果您想在底层编程、系统编程或嵌入式系统等领域工作,那么学习C是必要的。而如果您想在企业应用程序、Web应用程序或大型软件系统的开发方面有更好的发展机会,那么学习Java是一个不错的选择。 ### 回答2: C和Java都是目前广泛应用的编程语言,但是它们的前景却有一些不同。 首先,就就业市场而言,Java的前景更好。Java在企业级应用开发方面具有广泛的应用,很多大型企业和组织都使用Java进行开发。随着人工智能、金融科技等领域的速发展,对Java开发人员的需求也越来越大。同时,Java具有跨平台性和丰富的开发工具和框架,使得开发人员可以更加高效地进行开发工作。因此,对于想要从事企业级应用开发的程序员来说,学习并掌握Java编程将会有更多的就业机会。 然而,C语言在一些特定领域也有自己独特的优势和前景。在嵌入式系统、操作系统和驱动开发等领域,C语言仍然是主流的编程语言。这些领域对于性能和效率要求很高,C语言的底层控制和内存管理能力使其成为最理想的选择。此外,C语言也是其他高级语言的基础,掌握C语言有助于更好地理解和学习其他编程语言。 综上所述,C语言和Java都有各自的优势和前景。如果想从事企业级应用开发,Java是更好的选择;而如果对嵌入式系统和底层开发感兴趣,学习C语言是更明智的选择。同时,持续学习和不断更新自己的技能,对于应对不断变化的就业市场也是至关重要的。 ### 回答3: C和Java是两种非常常见的编程语言,都有着广泛的应用领域。C语言是一种在系统级别上进行编程的语言,用于开发底层操作系统和设备驱动程序等。Java语言则是一种高级的面向对象编程语言,具有简单易学、跨平台性和丰富的类库等特点。 就前景而言,无法简单地说哪个语言的前景更好,而是要根据不同的应用场景和需求来选择合适的语言。 对于底层的系统级开发,C语言更为适用。许多操作系统、嵌入式系统和驱动程序等都是使用C语言开发的,C语言能够直接访问硬件资源,具有较高的运行效率。 而对于大型应用程序的开发和企业级的软件开发,Java语言更受欢迎。Java具有跨平台的特性,一次编写多处运行,这使得Java语言成为构建各种类型软件的首选语言。Java拥有强大的开发工具和大量的第三方类库,能够提高开发效率和实现功能丰富的应用程序。 另外,随着人工智能、大数据和云计算等领域的速发展,对于并行计算和高性能计算方面的需求也在增加。在这一方面,C语言在性能上具有优势,能够更好地满足对处理能力要求较高的场景。 总的来说,C和Java都有自己的优势和适用场景,选择哪个语言更好要根据具体需求和个人兴趣来决定。根据当前的市场需求来看,Java语言在企业级应用开发方面的需求量大,但C语言在系统级和硬件开发领域依然占有一席之地。因此,对于初学者来说,了解并学习两种语言都是有好处的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值