随笔 - 312, 文章 - 14, 评论 - 1393, 引用 - 0
数据加载中……

Java 6 Hotspot的性能将有可能超越编译型语言

    Sun公司的Kohsuke Kawaguchi考察了Hotspot JIT在JDK6 u10 b14 debug版中产生的汇编代码,并将其记录在博客中。该博文着重阐述了Java优化的程度。

    Kawaguchi 将重点放在两个主要的地方。首先是循环展开(loop unrolling),它是这样一种技术:复制循环的每次迭代所调用的指令以构成一个序列。通过减少循环中计算机需要执行的指令,节省了执行时间。JIT 将其与预处理和事后分析相结合,同时Kawaguchi对此的补充也说明了这样的事实:编译器已从循环的快速执行部分当中移除了一个冗余的数组索引检查。此外,结果汇编代码证明了特定于处理器的优化程度如何。例如,Kawaguchi谈到了下面的代码:

private static byte[] foo() { byte[] buf = new byte[256]; for( int i=0; i buf[i] = 0; return buf; }

    所产生的汇编结果使用了特定于AMD64芯片的R8-R15通用寄存器汇编代码。

    其次是围绕着锁(locks)而进行的优化。在Java中非竞态锁的获取在不断地改进,而竞态锁的获取却一直存在问题。这个领域的工作还在持续进行中,但是Kawaguchi的工作却说明了几个已经得到改进的地方。

    这篇文章展示了该Hotspot编译器很多其他的特性,包括强大的内联——James Gosling注意到一篇相关的博文中说“甚至连存储分配和初始化都需要内联”。这一层级的侵略性(aggression)是可能存在的,部分原因在于 JVM会在必要时做一些潜在不安全的优化。Charles Nutter在今年初参加Lang.NET大会时曾对此提出了一个很好的解释。他也强调了这项工作与JRuby的关系,以及与任何面向JVM的语言的关系。

    “过去JVM有多种不同的能力去动态优化和再优化代码……或许最重要的是必要时的动态“逆优化(deoptimize)”。在处理性能问题时,逆优化(Deoptimization)令人非常兴奋,因为这意味着你可以进行更多的侵略性优化——对整个应用不确定的未来的潜在的不安全的优化——知道你可以在安全的路径上回退。一旦你几次遇到相同的路径,你就可以内联整个调用路径。除非明显需要,你可以忽略同步保护。你还可以在发现问题之后改变使用的优化集……本质上,在运行过程中你可以安全的“出错”并且从错误中学习。这就是为什么在特定的基准上Java超越了C和C++以及最终在几乎所有基准上它都能将超越C和C++的主要原因。同时这也是我们的JRuby与微软的IronPython和DLR相比,只需要做很少的事情就可以获得可接受的性能的一个关键原因。”

    从理论上讲,像Java这样的解释型语言的性能很有可能最终将超越编译型语言,因为它可以在运行时基于现有硬件进行优化,同时Java中不断提高的对特定于处理器的优化确实令人非常兴奋。对于面向Java平台的开发者来说,一个额外的好处在于随着新版本 Java编译器的发布,代码的性能会不断改进,而无需对应用的源码做任何更改。

英文原文:http://www.infoq.com/news/2008/05/hotspot_performance




Android开发完全讲义(第2版)(本书版权已输出到台湾)

http://product.dangdang.com/product.aspx?product_id=22741502



Android高薪之路:Android程序员面试宝典 http://book.360buy.com/10970314.html


新浪微博:http://t.sina.com.cn/androidguy   昵称:李宁_Lining

posted on 2008-05-14 17:16 银河使者 阅读(883) 评论(6)  编辑  收藏 所属分类: java

评论

# re: Java 6 Hotspot的性能将有可能超越编译型语言  回复  更多评论   

好像不太可能,怎么都会有一个加载字节码过程,解释型再优化都有中间代码的存在,本地代码则不同,肯定效率要高,如果字节码能优化的方法,本地代码也参照来优化一下,那么了节码仍然是无法比拟的,只是本地代码可能还不屑如此

就像竞走不会有跑快一样的。
2008-05-14 18:24 | 隔叶黄莺

# re: Java 6 Hotspot的性能将有可能超越编译型语言  回复  更多评论   

完全有可能,因为实际上java现在最后运行的是本地代码了,所以在足够优化的情况下是可以超过其他本地代码的。这看起来最后将是编译器的优化比较。
2008-05-16 00:21 | magicgod

# re: Java 6 Hotspot的性能将有可能超越编译型语言  回复  更多评论   

这也就是在持续运行的像企业应用服务程序有这个优势,能够尽可能的多运行本地代码。对于桌面程序,你每次启动,并在前面阶段的执行就是在解释字节码,弱点就体现在桌面程。
并且Java程序占用巨大的内存,这在硬件成本不高的情况,倒能够接受增加硬件成本换取性能的做法。
2008-05-25 19:24 | 隔叶黄莺

# re: Java 6 Hotspot的性能将有可能超越编译型语言  回复  更多评论   

这只是java支持者的yy而已,相同的架构和算法的情况下,java程序的执行速度要远低于c/c++的, java相对于c/c++的优势绝不在于程序执行的效率,而在于开发的效率。
2009-04-03 14:45 | Linux.Socket

# re: Java 6 Hotspot的性能将有可能超越编译型语言  回复  更多评论   

我以前在java环境下写jsp/servlet, 当时也以为这种服务器端的东西,java应该比c/c++慢不了多少,后来因为换了公司,变成用c/c++写cgi, web服务器用的ngix, 这才发现,即使在服务器端,java在c/c++面前,在速度方面,也是完全没有可比性的。。。当然,写c/c++程序要付出更多的努力,开发效率比java低
2009-04-03 14:50 | Linux.Socket

# re: Java 6 Hotspot的性能将有可能超越编译型语言[未登录]  回复  更多评论   

java6 比 5 快好多
2010-01-15 10:15 | billy

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


网站导航: