快速业务通道

Java编程的动态性,第8部分: 用代码生成取代反射 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
首先是使用 Javassist 代码生成的两个时间,然后是使用 BCEL 代码生成时的同样两个时间)。不管是 用 Javassist 还是 BCEL 生成 glue 类,执行时间大致是相同的,这也是我预计的结果 — — 但是确认一下总是好的!

图 1. 反射速度与生成的代码的速度(时间单位为毫秒)

从图 1 中可以看出,不管在什么情况下,生成的代码执行都比反射要快得多。生成的代 码的速度优势随着循环次数的增加而增加,在 2k 次循环时大约为 5:1,在 512K 次循环时 增加到大约 24:1。对于 Javassist,构造并装载第一个 glue 类需要大约 320 毫秒(ms) ,而对于 BCEL 则为 370 ms,而构造第二个 glue 类对于 Javassist 只用 4 ms,对于 BCEL 只用 2 ms(由于时钟分辨率只有 1ms,因此这些时间是非常粗略的)。如果将这些时 间结合到一起,将会看到即使对于 2k 次循环,生成一个类也比使用反射有更好的整体性能 (总执行时间为约 4 ms 到 6 ms,而使用反射时大约为 14 ms)。

此外,实际情况比这个图中所表明的更有利于生成的代码。在循环减少至 25 次循环时, 反射代码的执行仍然要用 6 ms 到 7 ms,而生成的代码运行得太快以致不能记录。针对相对 较少的循环次数,反射所花的时间反映出,当达到一个阈值时在 JVM 中进行了某种优化,如 果我将循环次数降低到少于 20,那么反射代码也会快得无法记录。

加速上路

现在已经看到了运行时 classworking 可以为应用程序带来什么样的性能。下次面临难处 理的性能优化问题时要记住它 —— 它可能就是避免大的重新设计的关键所在。不过, Classworking 不仅有性能上的有好处,它还是一种使应用程序适合运行时要求的灵活方式。 即使没有理由在代码中使用它,我也认为它是使编程变得有趣的一种 Java 功能。

对一个 classworking 的真实世界应用程序的探讨结束了“Java 编程的动态性”这一系 列。但是不要失望 —— 当我展示一些为操纵 Java 字节码而构建的工具时,您很快就有机 会在 developerWorks 中了解一些其他的 classworking 应用程序了。首先将是一篇关于 Mother Goose直接推出的两个测试工具的文章。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号