快速业务通道

Java编程的动态性,第2部分: 引入反射 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
ror using reflection");      throw ex;    } }

Java编程的动态性,第2部分: 引入反射(5)

时间:2011-04-09 IBM Dennis M. Sosnoski

测试程序重复调用每种方法,使用一个大循环数,从而平均多次调用的时间衡量结果。平 均值中不包括每种方法第一次调用的时间,因此初始化时间不是结果中的一个因素。在为本 文进行的测试中,每次调用时我使用1000万的循环数,在1GHz PIIIm系统上运行。三个不同 Linux JVM的计时结果如图1所示。所有测试使用每个JVM的缺省设置。

图 1:字段接入时间

上表的对数尺度可以显示所有时间,但减少了差异看得见的影响。在前两副图中(Sun JVM),使用反射的执行时间超过使用直接接入的1000倍以上。通过比较,IBM JVM可能稍好一 些,但反射方法仍旧需要比其它方法长700倍以上的时间。任何JVM上其它两种方法之间时间 方面无任何显著差异,但IBM JVM几乎比Sun JVM快一倍。最有可能的是这种差异反映了Sun Hot Spot JVM的专业优化,它在简单基准方面表现得很糟糕。

除了字段接入时间测试之外,我还进行了相同的方法调用时间测试。在方法调用中,我试 用了与字段接入相同的三种接入变量,并增加了使用无参数方法变量,而不是在方法调用中 传递和返回一个值。清单8显示了用于测试调用传递和返回值形式的三种方法的代码。

清单 8:方法接入性能测试代码

public int callDirectArgs(int loops) {    int value = 0;    for (int index = 0; index < loops; index++) {      value = step(value);    }    return value; } public int callReferenceArgs(int loops) {    TimingClass timing = new TimingClass();    int value = 0;    for (int index = 0; index < loops; index++) {      value = timing.step(value);    }    return value; } public int callReflectArgs(int loops) throws Exception {    TimingClass timing = new TimingClass();    try {      Method method = TimingClass.class.getMethod        ("step", new Class [] { int.class });      Object[] args = new Object[1];      Object value = new Integer(0);      for (int index = 0; index < loops; index++) {        args[0] = value;        value = method.invoke(timing, args);      }      return ((Integer)value).intValue();    } catch (Exception ex) {      System.out.println("Error using reflection");      throw ex;    } }

Java编程的动态性,第2部分: 引入反射(6)

时间:2011-04-09 IBM Dennis M. Sosnoski

图 2显示了我从方法调用中获得的计时结果。反射远慢于直接接入。差异不象字段接入那 么大,但是,在不使用参数的情况下,范围从Sun 1.3.1 JVM的数百倍到IBM JVM的不到30倍 。在所有JVM上,使用参数的反射方法调用的测试性能慢于不使用参数的调用。由于传递和返 回 int 值需要的 java.lang.Integer 封装,这可能是局部的。由于 Integer s是不可变的 ,每种方法返回提出了一种新的需求,它将增加大量的开销。

图 2:方法调用时间

反射性能是Sun开发1.4 JVM时关注的一个方面,它在反射方法调用结果中显示。在这类操 作的性能方面,Sun 1.4.1 JVM显示了比1.3.1版本很大的改进,在我的测试中运行速度大约 是1.3.1版本的开部。在这类简单的测试中,IBM 1.4.0 JVM再次获得了更好的成绩,但是只 比Sun 1.4.1 JVM快两到三倍。

我还为创建使用反

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号