WEB开发网
开发学院软件开发Java Java 编程的动态性,第 2部分: 引入反射 阅读

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

 2010-03-18 00:00:00 来源:WEB开发网   
核心提示: 测试程序重复调用每种方法,使用一个大循环数,Java 编程的动态性,第 2部分: 引入反射(9),从而平均多次调用的时间衡量结果,平均值中不包括每种方法第一次调用的时间,并增加了使用无参数方法变量,而不是在方法调用中传递和返回一个值,因此初始化时间不是结果中的一个因素,在为本文进行的测试中

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

图 1:字段接入时间
Java 编程的动态性,第 2部分: 引入反射

上表的对数尺度可以显示所有时间,但减少了差异看得见的影响。在前两副图中(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; 
  } 
} 

上一页  4 5 6 7 8 9 10  下一页

Tags:Java 编程 动态性

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接