設(shè)計java

          j2ee輕量級框架,IMVC,IORM && web網(wǎng)絡(luò)游戲

          #

          java反射性能測試分析

              java有別于其他編程語言而讓我著迷的特性有很多,其中最喜歡的是接口設(shè)計,他讓我們設(shè)計的東西具有美感。同樣反射也是我比較喜歡的一個特性,他讓程序自動運行,動態(tài)加載成為了可能,同時也是現(xiàn)在很多流行框架所必不可少的特性,struts,hibernate等都是,spring本身就是基于反射的就更不用說了。細細想來,似乎很少有不涉及到反射的框架。我自己設(shè)計框架的時候,開始也都是運用反射,但是越深入?yún)s讓我越疑惑,反射的效率一直是我設(shè)計框架的心病。

              今天在優(yōu)化InstantMVC的時候就考慮怎么提高自動封裝form的效率,struts是用的commons-beantuils,好像也沒人說struts的效率不高,誠然,beanUtils中很多有用方便的特性讓反射開發(fā)者著迷,但是通過我今天的測試,卻發(fā)現(xiàn)beanUtils的易用性要付出巨大的性能代價,雖然在現(xiàn)在這個年代,這么點性能不算什么,但是對于我這種執(zhí)著的人開發(fā)執(zhí)著的框架,還是對性能有種獨特的偏好,目前來說InstantMVC中用的是直接的反射簡單封裝,而InstantORM(我的持久層框架)中用到是自動生成pojo和相應(yīng)的pojo輔助類來實現(xiàn)動態(tài)高效(比直接的反射高效10-20倍)執(zhí)行Object的方法(一般是get和set),對于InstantMVC的form利用動態(tài)生成輔助類有一定的難度,不是說實現(xiàn)難度,而是對于運用該框架的web開發(fā)者來說,不夠直接。所以還是主要考慮用反射的,廢話不說,下面開始今天的測試。

              首先,測試主要有三部分組成,測試創(chuàng)建對象的性能,測試set方法的性能,測試get方法的性能。我沒有看過beanUtils的源代碼,不過評我的經(jīng)驗想想BeanUtils應(yīng)該是做了一些性能的優(yōu)化的,初步猜測是第一次運行緩存Object的相應(yīng)東東(具體是什么也不知道),所以測試的時候都是從第二次開始,忽略第一次。下面是測試代碼(省略了異常拋出。)   

             
          public class MyBean {
              String name;
              
          int age;
              String[] firends;
              
          public static void main(String args[]) {
                  Object o1
          =beanUtilsCreate();
                  Object o2
          =javaCreate();
                  MyBean my
          =new MyBean();
                  
          long a=System.currentTimeMillis();
                 
                
                  
          for(int i=0;i<5000;i++){
                      
          //47
                      
          //beanUtilsCreate();
                      
          //15
                      
          //javaCreate();
                      
          //0
                      
          //manualCreate();
                      
                      
          //235
                      
          //beanUtilsSet(o1);
                      
          //40
                      
          //javaSet(o2);
                      
          //0
                      
          //manualSet(my);
                      
                      
          //203
                      
          //beanUtilsGet(o1);
                      
          //47
                      
          //javaGet(o2);
                      
          //0
                      
          //manualGet(my);
                  }
                  
          long b=System.currentTimeMillis();
                  System.out.println(b
          -a);
              }
              
              
              
          //===============下面是 beanUtils的方法
              public static Object beanUtilsCreate() {
                  Object ob
          =ConstructorUtils.invokeConstructor(MyBean.class,null);
                  
          return ob;
              }
              
          public static void beanUtilsSet(Object ob) {
                  BeanUtils.setProperty(ob, 
          "name""旺旺旺");
              }
              
          public static void beanUtilsGet(Object ob) {
                  BeanUtils.getProperty(ob, 
          "name");
              }
              
              
          //    ===============下面是 java自身的直接反射的方法
              public static Object javaCreate() {
                  Object ob
          =MyBean.class.newInstance();
                  
          return ob;
              }
              
          public static void javaSet(Object ob) {
                  Method m
          =MyBean.class.getDeclaredMethod("setName"new Class[]{String.class});
                  m.invoke(ob,
          new Object[]{"旺旺旺"});
              }
              
          public static void javaGet(Object ob) {
                  Method m
          =MyBean.class.getDeclaredMethod("getName"new Class[0]);
                  m.invoke(ob,
          new Object[0]);
              }
              
          //    ===============下面是 手動的創(chuàng)建對象
              public static MyBean manualCreate(){
                  MyBean my
          =new MyBean();
                  
          return my;
              }
              
          public static void manualSet(MyBean my){
                  my.setName(
          "旺旺旺");
              }
              
          public static void manualGet(MyBean my){
                  my.getName();
              }
              
              
              
              
          public int getAge() {
                  
          return age;
              }
              
          public void setAge(int age) {
                  
          this.age = age;
              }
              
          public String[] getFirends() {
                  
          return firends;
              }
              
          public void setFirends(String[] firends) {
                  
          this.firends = firends;
              }
              
          public String getName() {
                  
          return name;
              }
              
          public void setName(String name) {
                  
          this.name = name;
              }
          }

              上面代碼首先創(chuàng)建一個MyBean,簡單的name和age屬性,然后get和set方法,在main方法中首先構(gòu)建三個類:
          Object o1=beanUtilsCreate();
          Object o2
          =javaCreate();
          MyBean my
          =new MyBean();
          為了防止beanUtils內(nèi)部對第一次做了緩存操作而使測試不準(zhǔn)確。

          第二次開始連續(xù)循環(huán)5000次分別測試 Create,set,和get的性能。
          結(jié)果顯示如下:

          ===================================================
                 BeanUtils   java自己反射   手動
          創(chuàng)建:    47          15            0     
          set方法   235         40            0
          get方法   203         47            0

          ===================================================
          jdk 1.6,1G內(nèi)存,AMD 2600+

              從上面的結(jié)果可以看出,BeanUtils的性能確實不怎么樣,這樣的結(jié)果雖然在現(xiàn)代服務(wù)器都菜價了的年代,我還是要為struts和spring等基于反射的框架捏一把汗。不知道spring有沒有對反射做過優(yōu)化,不過上次看Ibatis的時候好像他提供了一個配置選項來增強字節(jié)碼的反射效率,大概就是那種動態(tài)創(chuàng)建字節(jié)碼的技術(shù)吧。


          posted @ 2008-06-07 16:31 剎那 閱讀(11683) | 評論 (12)編輯 收藏

          僅列出標(biāo)題
          共2頁: 上一頁 1 2 
          主站蜘蛛池模板: 贵德县| 海兴县| 土默特左旗| 铜山县| 左云县| 博爱县| 饶平县| 华坪县| 仁寿县| 信阳市| 玉田县| 若尔盖县| 郯城县| 游戏| 朝阳区| 孟津县| 深州市| 上饶市| 南宫市| 长乐市| 广南县| 门源| 青浦区| 井冈山市| 江孜县| 鄯善县| 伊川县| 谢通门县| 牙克石市| 博罗县| 灵川县| 阳朔县| 大埔县| 临湘市| 娱乐| 得荣县| 久治县| 齐齐哈尔市| 呼伦贝尔市| 东安县| 上栗县|