duansky'weblog

          統(tǒng)計(jì)

          留言簿(3)

          友情鏈接

          閱讀排行榜

          評論排行榜

          java反射性能測試分析

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

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

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

          ???
          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]);
          ????}
          ????
          //????===============下面是?手動(dòng)的創(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)建一個(gè)MyBean,簡單的name和age屬性,然后get和set方法,在main方法中首先構(gòu)建三個(gè)類:
          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自己反射?? 手動(dòng)
          創(chuàng)建:??? 47 ? ?? ??? 15?? ??? ???? 0 ? ??
          set方法?? 235?? ?? ?? 40?? ?? ?? ?? 0
          get方法?? 203?? ?? ?? 47?? ?? ?? ?? 0

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

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

          轉(zhuǎn)自: http://www.aygfsteel.com/kingyaoo/archive/2008/06/07/206533.html

          posted on 2009-09-22 15:03 duansky 閱讀(484) 評論(0)  編輯  收藏 所屬分類: Java

          主站蜘蛛池模板: 南汇区| 陵川县| 循化| 大方县| 江西省| 西宁市| 巴彦淖尔市| 永兴县| 东方市| 静宁县| 定襄县| 锦州市| 辽中县| 惠安县| 乾安县| 鄂托克前旗| 山阴县| 乌苏市| 灵川县| 濉溪县| 岗巴县| 涟源市| 徐汇区| 镇雄县| 怀集县| 清苑县| 四会市| 灵台县| 阿拉善盟| 镇坪县| 唐山市| 兰溪市| 紫金县| 奉节县| 容城县| 林西县| 和平区| 比如县| 甘洛县| 富源县| 马山县|