测试Java反射效率

来源:互联网 发布:linux修改文件权限命令 编辑:程序博客网 时间:2024/05/16 14:51

测试分为3个方面:1. 实例化效率;2. 方法调用效率;3. 成员变量GET调用效率;4. 成员变量SET调用

测试环境:

Windows 7

Sun Java 1.6

 

先写好备测试用的类

import java.util.Date;


public class DemoClass{
 public String firstName;
 private String endName;
 private Date birthDay;
 private String email;
 private String phone;
 private DemoClass parent;
 
 public String getFirstName() {
     return firstName;
    }
 public void setFirstName(String firstName) {
     this.firstName = firstName;
    }
 public String getEndName() {
     return endName;
    }
 public void setEndName(String endName) {
     this.endName = endName;
    }
 public Date getBirthDay() {
     return birthDay;
    }
 public void setBirthDay(Date birthDay) {
     this.birthDay = birthDay;
    }
 public String getEmail() {
     return email;
    }
 public void setEmail(String email) {
     this.email = email;
    }
 public String getPhone() {
     return phone;
    }
 public void setPhone(String phone) {
     this.phone = phone;
    }
 public DemoClass getParent() {
     return parent;
    }
 public void setParent(DemoClass parent) {
     this.parent = parent;
    }

 

1. 实例化效率

1) 正常调用

public class TestReflectNew {

 public static void main(String[] args) throws Exception{
    
     int i = 0;
     long start = System.currentTimeMillis();
     while(i<1000000){
      i++;
//      DemoClass.class.newInstance();
      new DemoClass();
     }
    
     long end = System.currentTimeMillis();
     System.err.println((end - start) + " MillSeconds");
    }
}
三次输出:

18 MillSeconds

19 MillSeconds

20 MillSeconds

均值:19

 

2) 反射调用

public class TestReflectNew {

 public static void main(String[] args) throws Exception{
    
     int i = 0;
     long start = System.currentTimeMillis();
     while(i<1000000){
      i++;
      DemoClass.class.newInstance();
//      new DemoClass();
     }
    
     long end = System.currentTimeMillis();
     System.err.println((end - start) + " MillSeconds");
    }
}
 三次输出:

191 MillSeconds

193 MillSeconds
192 MillSeconds

均值:192

 

2. 方法调用测试

1) 正常调用

public class TestReflectMethod {

 public static void main(String[] args) throws Exception{
    
     int i = 0;
     DemoClass dc = new DemoClass();
     long start = System.currentTimeMillis();
     while(i<1000000){
      i++;
//      DemoClass.class.getMethod("getBirthDay").invoke(dc);
      dc.getBirthDay();
     }
    
     long end = System.currentTimeMillis();
     System.err.println((end - start) + " MillSeconds");
    }
}

 三次输出:

2 MillSeconds

2 MillSeconds

2 MillSeconds

均值:2

2) 反射调用

public class TestReflectMethod {

 public static void main(String[] args) throws Exception{
    
     int i = 0;
     DemoClass dc = new DemoClass();
     long start = System.currentTimeMillis();
     while(i<1000000){
      i++;
      DemoClass.class.getMethod("getBirthDay").invoke(dc);
//      dc.getBirthDay();
     }
    
     long end = System.currentTimeMillis();
     System.err.println((end - start) + " MillSeconds");
    }
}

 三次输出:

1223 MillSeconds

1201 MillSeconds

1207 MillSeconds

均值1210

 

3. 测试成员变量GET

1) 正常调用

public class TestReflectFieldGet {

 public static void main(String[] args) throws Exception{
    
     int i = 0;
     DemoClass dc = new DemoClass();
     String s;
     long start = System.currentTimeMillis();
     while(i<1000000){
      i++;
//      s = (String) DemoClass.class.getField("firstName").get(dc);
      s = dc.firstName;
     }
    
     long end = System.currentTimeMillis();
     System.err.println((end - start) + " MillSeconds");
    }
}
 三次输出:

2 MillSeconds

1 MillSeconds

3 MillSeconds

均值:2

 

2) 反射调用

public class TestReflectFieldGet {

 public static void main(String[] args) throws Exception{
    
     int i = 0;
     DemoClass dc = new DemoClass();
     String s;
     long start = System.currentTimeMillis();
     while(i<1000000){
      i++;
      s = (String) DemoClass.class.getField("firstName").get(dc);
//      s = dc.firstName;
     }
    
     long end = System.currentTimeMillis();
     System.err.println((end - start) + " MillSeconds");
    }
}
 三次输出:

992 MillSeconds

1000 MillSeconds

1005 MillSeconds

均值:999

 

4. 测试成员变量SET

1) 正常调用

public class TestReflectFieldSet {

 public static void main(String[] args) throws Exception {
    
     int i = 0;
     DemoClass dc = new DemoClass();
     String s = null;
     long start = System.currentTimeMillis();
     while(i<1000000){
      i++;
      dc.firstName = s;
//      DemoClass.class.getField("firstName").set(dc, s);
     }
    
     long end = System.currentTimeMillis();
     System.err.println((end - start) + " MillSeconds");
    }
}

 三次输出:

1 MillSeconds

2 MillSeconds

2 MillSeconds

均值:1.7

2) 反射调用

public class TestReflectFieldSet {

 public static void main(String[] args) throws Exception {
    
     int i = 0;
     DemoClass dc = new DemoClass();
     String s = null;
     long start = System.currentTimeMillis();
     while(i<1000000){
      i++;
//      dc.firstName = s;
      DemoClass.class.getField("firstName").set(dc, s);
     }
    
     long end = System.currentTimeMillis();
     System.err.println((end - start) + " MillSeconds");
    }
} 三次输出:

998 MillSeconds

1021 MillSeconds

1007 MillSeconds

均值:1009

 

来个统计

 反射平均时间 非反射平均时间 比值
实例化 192 19 10
方法调用 1210 2 605
成员Get 999 2 500
成员Set 1009 1.7 593

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 临时用电电缆线破皮怎么办 阳台按自来水墙面脱落怎么办 墙被暖气熏黑了怎么办 下水管比地砖低怎么办 马桶下水管短了怎么办 下水管比马桶低怎么办? 寻常疣液氮冷冻后该怎么办 寻常疣冷冻后起水泡胀痛怎么办 冷冻后大水泡痒怎么办 19岁的宫颈糜烂怎么办 发面酸了没有碱怎么办 面发时间长酸了怎么办 丽珠兰打完红肿怎么办 美的冰柜冷藏室结冰怎么办 胃下午和晚上痛怎么办 二胡弓毛粗拉外弦触到里弦怎么办 电视成黑白的了怎么办 城市居民无钱入社保医保怎么办 老婆说离婚又找不到怎么办 爱一个人太累了怎么办 车凹陷漏底漆了怎么办 燕子窝掉下来了怎么办 文科没考上一本怎么办 学校午休小学孩子吵闹怎么办 老鼠死在空调里怎么办 公务员老公四十岁想辞职怎么办 打胎5次又怀孕怎么办 墙纸颜色太淡了怎么办 皮子腺囊肿有点疼痛怎么办 地板颜色选浅了怎么办 地板买的太暗了怎么办 木地板贴好后发现颜色不好看怎么办 鞋上鞋扣老是开怎么办 虚拟机的win10蓝屏重启怎么办 fs免拆模板专利怎么办 新买的床咯吱响怎么办 实木床一动就响怎么办 cad图纸是斜的怎么办 老房子土墙腻子老掉怎么办 生完孩子子宫大怎么办 刚开的店没人怎么办