论坛首页 Java企业应用论坛

对Web中的Action使用反射与否影响不大

浏览 2285 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-06-19   最后修改:2009-11-30
感觉反射调用对整个Web过程来说可以忽略不计哦,虽然和直接调用相差还是蛮大的

我机器(945主板、Celeron D 3.06、1G内存、XP系统)的测试结果:
不添加干扰方法
:797
:109

添加了干扰方法后

:812
:120


大家可以做下测试,代码如下
package example;

import java.lang.reflect.Method;

public class Methoder {

	public static void main(String[] args) throws Exception {
		long start = System.currentTimeMillis();
		for (int i = 0; i < 100000; ++i) {
			p1();
		}
		System.out.println(":" + (System.currentTimeMillis() - start));
		start = System.currentTimeMillis();
		for (int i = 0; i < 100000; ++i) {
			p2();
		}
		System.out.println(":" + (System.currentTimeMillis() - start));
	}

	public static void p1() throws Exception {
		Test t = new Test();
		Class c = t.getClass();
		Method m = c.getMethod("sayHello", new Class[0]);
		m.invoke(t, new Object[0]);
	}

	public static void p2() throws Exception {
		Test t = new Test();
		t.sayHello();
	}

}

class Test {
	public void sayHello() {
		//		System.out.println("Test:");
		int l = 0;
		for (int i = 0; i < 1000; ++i) {
			l += i;
		}
	}

	// 以下方法为干扰用,但是两种调用方法都时间延长了点
	public void sayHello1() {
	}

	public void sayHello2() {
	}

	public void sayHello3() {
	}

	public void sayHello4() {
	}

	public void sayHello5() {
	}

	public void sayHello6() {
	}

	public void sayHello7() {
	}

	public void sayHello8() {
	}

	public void sayHello9() {
	}

	public void sayHello10() {
	}

	public void sayHello11() {
	}

	public void sayHello12() {
	}

	public void sayHello13() {
	}

	public void sayHello14() {
	}

	public void sayHello15() {
	}

	public void sayHello16() {
	}

	public void sayHello17() {
	}

	public void sayHello18() {
	}

	public void sayHello19() {
	}

	public void sayHello20() {
	}

	public void sayHello21() {
	}

	public void sayHello22() {
	}

	public void sayHello23() {
	}

	public void sayHello24() {
	}

	public void sayHello25() {
	}

	public void sayHello26() {
	}

	public void sayHello27() {
	}

	public void sayHello28() {
	}

	public void sayHello29() {
	}

	public void sayHello30() {
	}

}
   发表时间:2008-06-19  
CPU: Dual E2180 2.00Ghz
测试的时候别的软件占用CPU 16%左右

Jdk:1.4.2

:937
:266
Jdk:1.6.0.05
:438
:140
这跟jdk的版本有很大关系的,jdk1.5以后性能提高很多。
0 请登录后投票
   发表时间:2008-06-19  
这样的测试不严谨,过于简单化了,考虑以下两者情况:
1、类构造函数和运行方法中加入不同数据量的引用类型参数再进行对比
2、Method.invoke()、t.hello()各自抛出一定数量的异常
结果会不同,Sun官方结论是基于反射的执行效率约为实例调用的1/2。
0 请登录后投票
   发表时间:2008-06-19  
我设想的是这样一种情况
针对 http://localhost/admin/index
我指向 AdminAction的index 方法,那么index方法就要通过反射来调用了
0 请登录后投票
   发表时间:2008-06-19  
nwangwei 写道
我设想的是这样一种情况
针对 http://localhost/admin/index
我指向 AdminAction的index 方法,那么index方法就要通过反射来调用了

这种反射造成的开销完全可以忽略不计。
瓶颈绝不会在这里,只会在IO、网络吞吐、数据库存取之类的地方。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics