<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    duansky'weblog

    統計

    留言簿(3)

    友情鏈接

    閱讀排行榜

    評論排行榜

    java反射性能測試分析

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

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

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

    ???
    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]);
    ????}
    ????
    //????===============下面是?手動的創建對象
    ????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;
    ????}
    }

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

    第二次開始連續循環5000次分別測試 Create,set,和get的性能。
    結果顯示如下:

    ===================================================
    ??? ?? BeanUtils?? java自己反射?? 手動
    創建:??? 47 ? ?? ??? 15?? ??? ???? 0 ? ??
    set方法?? 235?? ?? ?? 40?? ?? ?? ?? 0
    get方法?? 203?? ?? ?? 47?? ?? ?? ?? 0

    ===================================================
    jdk 1.6,1G內存,AMD 2600+

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

    轉自: http://m.tkk7.com/kingyaoo/archive/2008/06/07/206533.html

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

    主站蜘蛛池模板: 亚洲乱色熟女一区二区三区蜜臀| 亚洲av片劲爆在线观看| 亚洲欧美国产日韩av野草社区| 1000部禁片黄的免费看| 亚洲日韩在线视频| 波多野结衣免费在线| 国产成人精品日本亚洲11| 无码人妻久久一区二区三区免费丨| 亚洲三级视频在线观看| 无遮免费网站在线入口| 亚洲欧洲精品成人久久曰| 女人被男人桶得好爽免费视频| 亚洲а∨精品天堂在线| 国产一区视频在线免费观看| 牛牛在线精品观看免费正| 中文字幕精品无码亚洲字| a国产成人免费视频| 亚洲黄色免费在线观看| 一二三四影视在线看片免费 | 99久久综合精品免费 | 亚洲一区二区久久| 四虎成人免费大片在线| 日韩毛片免费一二三| 亚洲Av综合色区无码专区桃色| 99re热精品视频国产免费| 亚洲香蕉久久一区二区| 永久免费bbbbbb视频| aa级女人大片喷水视频免费| 亚洲黄色片免费看| 日本免费人成视频播放| 怡红院免费全部视频在线视频| 亚洲专区一路线二| 亚洲不卡无码av中文字幕| 午夜理伦剧场免费| 亚洲GV天堂无码男同在线观看| 久久久久亚洲精品中文字幕| 1a级毛片免费观看| 又黄又大的激情视频在线观看免费视频社区在线 | 无码囯产精品一区二区免费| 国产精品亚洲午夜一区二区三区| 亚洲欧洲日产国码一级毛片|