Java 编程的动态性,第 8 部分: 用代码生成取代反射
2010-03-18 00:00:00 来源:WEB开发网为了进行简单的计时测试,我调用 run() 方法两次,对于 清单 1 HolderBean 类中的每个属性调用一次。运行两次测试对于测试的公正性是很重要的 —— 第一次运行代码要装载所有必要的类,这对于 Javassist 和 BCEL 类生成过程都会增加大量开销。不过,在第二次运行时不需要这种开销,这样就能更好地估计在实际的系统中使用时,类生成需要多长的时间。下面是一个执行测试时生成的示例输出:
[dennis]$$ java -cp .:bcel.jar BCELCalls 2000
Generate and load time of 409 ms.
Reflection took 61 ms. with result 2000 (2000, 0)
Generated took 2 ms. with result 2000 (2000, 0)
Generate and load time of 1 ms.
Reflection took 13 ms. with result 2000 (0, 2000)
Generated took 2 ms. with result 2000 (0, 2000)
图 1 显示了用从 2k 到 512k 次循环进行调用时计时测试的结果(在运行 Mandrake Linux 9.1 的 Athlon 2200+ XP 系统上运行测试,使用 Sun 1.4.2 JVM )。这里,我在每次测试运行中加入了第二个属性的反射时间和生成的代码的时间(这样首先是使用 Javassist 代码生成的两个时间,然后是使用 BCEL 代码生成时的同样两个时间)。不管是用 Javassist 还是 BCEL 生成 glue 类,执行时间大致是相同的,这也是我预计的结果 —— 但是确认一下总是好的!
图 1. 反射速度与生成的代码的速度(时间单位为毫秒)
更多精彩
赞助商链接