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

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

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

    隨筆 - 3  文章 - 10  trackbacks - 0
    <2009年9月>
    303112345
    6789101112
    13141516171819
    20212223242526
    27282930123
    45678910

    常用鏈接

    留言簿(3)

    隨筆檔案

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    posted @ 2009-10-13 23:35 TaoLei 閱讀(209) | 評(píng)論 (0)編輯 收藏
    最近有做個(gè)C++ for JNI 的輔助類庫(kù)和工具的想法,使得在JNI里可以用對(duì)象化的模式來(lái)訪問(wèn)java對(duì)象。例如java::lang::System::out->println();

    這個(gè)類庫(kù)和輔助工具除了支持對(duì)象化訪問(wèn)外,還可以帶來(lái)的方便有:
     原來(lái)需要手工寫(xiě)入代碼中的大量的classname/membername和type sig可以自動(dòng)生成
     原來(lái)經(jīng)常需要檢查java exception,可以利用C++的try/catch模式做Exception處理
     原來(lái)手工javah生成include文件的方法可以通過(guò)輔助工具自動(dòng)生成和java class對(duì)應(yīng)的C++ 類函數(shù)定義,開(kāi)發(fā)者只需要實(shí)現(xiàn)這個(gè)函數(shù)即可。
     提供一些輔助函數(shù)、宏定義和模板使得開(kāi)發(fā)JNI更加方便。例如ansi/unicode/jstring字符串轉(zhuǎn)換、C++版本的StringBuilder、外部動(dòng)態(tài)加載jvm等。

    在gnu的gcj里采用的就是類似的模式。我看到的sun的jdk源代碼里也普遍采用了這種模式,也許將來(lái)sun會(huì)發(fā)布一個(gè)JNI的C++版本。
    posted @ 2009-09-17 05:51 TaoLei 閱讀(1501) | 評(píng)論 (2)編輯 收藏

    jni的幾個(gè)基本的性能測(cè)試分析

    今天對(duì)jvm運(yùn)行jni做了幾個(gè)基本的性能測(cè)試,測(cè)試的jvm有jdk1.4.2_19、jdk1.5.0_04和jdk1.6.0_14,測(cè)試的重復(fù)次數(shù)都是一億次,測(cè)試結(jié)果的絕對(duì)數(shù)值意義不大,僅供參考。
    java調(diào)用jni空函數(shù)和調(diào)用java方法的性能(比較):
    java.version = 1.6.0_14
     Java空方法調(diào)用  耗時(shí) 329 ms   平均每秒  303951367
     JNI空方法調(diào)用   耗時(shí) 1531 ms  平均每秒  65316786

    java.version = 1.5.0_04
     java空方法調(diào)用  耗時(shí) 312 ms   平均每秒  320512820
     JNI空方法調(diào)用   耗時(shí) 1891 ms  平均每秒  52882072

    java.version = 1.4.2_19
     java空方法調(diào)用  耗時(shí) 312 ms   平均每秒  320512820
     JNI空方法調(diào)用   耗時(shí) 3672 ms  平均每秒  27233115
     
     jdk版本越高,JNI調(diào)用的性能越好,這點(diǎn)要感謝sun的努力了。
    在jdk1.6下,僅僅是空方法調(diào)用,JNI的性能就要比java內(nèi)部調(diào)用慢將近5倍,而在jdk1.4下更是慢了十多倍。

     

    jni里查找class(JNIEnv.FindClass)和fieldid(JNIEnv.GetFieldID)和jni讀取java Field(JNIEnv.GetFieldValue)的性能:
    緩存表示只調(diào)用一次,不緩存就是每次都調(diào)用。

    java.version = 1.6.0_14
    JNI 字段讀取 (緩存Class=false ,緩存字段ID=false) 耗時(shí) : 79172 ms    平均每秒 : 1263072
    JNI 字段讀取 (緩存Class=true ,緩存字段ID=false)  耗時(shí) : 25015 ms    平均每秒 : 3997601
    JNI 字段讀取 (緩存Class=false ,緩存字段ID=true)  耗時(shí) : 50765 ms    平均每秒 : 1969861
    JNI 字段讀取 (緩存Class=true ,緩存字段ID=true)   耗時(shí) : 2125 ms     平均每秒 : 47058823

    java.version = 1.5.0_04
    JNI 字段讀取 (緩存Class=false ,緩存字段ID=false) 耗時(shí) : 87109 ms    平均每秒 : 1147987
    JNI 字段讀取 (緩存Class=true ,緩存字段ID=false)  耗時(shí) : 32031 ms    平均每秒 : 3121975
    JNI 字段讀取 (緩存Class=false ,緩存字段ID=true)  耗時(shí) : 51657 ms    平均每秒 : 1935846
    JNI 字段讀取 (緩存Class=true ,緩存字段ID=true)   耗時(shí) : 2187 ms     平均每秒 : 45724737

    java.version = 1.4.2_19
    JNI 字段讀取 (緩存Class=false ,緩存字段ID=false) 耗時(shí) : 97500 ms    平均每秒 : 1025641
    JNI 字段讀取 (緩存Class=true ,緩存字段ID=false)  耗時(shí) : 38110 ms    平均每秒 : 2623983
    JNI 字段讀取 (緩存Class=false ,緩存字段ID=true)  耗時(shí) : 55204 ms    平均每秒 : 1811462
    JNI 字段讀取 (緩存Class=true ,緩存字段ID=true)   耗時(shí) : 4187 ms     平均每秒 : 23883448

     查找class和ID(field和method)消耗大量的時(shí)間。只是讀取字段值的時(shí)間基本上跟上面的JNI空方法是一個(gè)數(shù)量級(jí)。
     而如果每次都根據(jù)名稱查找class和field的話,性能要下降高達(dá)40倍。
     讀取一個(gè)字段值的性能在百萬(wàn)級(jí)上,在交互頻繁的JNI應(yīng)用中是不能忍受的。
     消耗時(shí)間最多的就是查找class,因此在Native里保存class和member id是必要的。
     class和member id在一定范圍內(nèi)是穩(wěn)定的,但在動(dòng)態(tài)加載的class loader下,保存全局的class要么可能失效,要么可能造成無(wú)法卸載classloader,
     在諸如OSGI框架下的JNI應(yīng)用還要特別注意這方面的問(wèn)題。

     在讀取字段值和查找FieldID上,jdk1.4和1.5、1.6的差距是非常明顯的。但在最耗時(shí)的查找class上,三個(gè)版本沒(méi)有明顯差距。

     

     

    基于線程變量(TlsSetValue/TlsGetValue)的JNIEnv讀取和基于JavaVM的JNIEnv讀取(JavaVM.GetEnv)

    JNIEnv讀取 (線程變量)   耗時(shí) : 516 ms      平均每秒 : 193798449

    java.version = 1.6.0_14
    JNIEnv讀取 (JavaVM)     耗時(shí) : 1985 ms     平均每秒 : 50377833

    java.version = 1.5.0_04
    JNIEnv讀取 (JavaVM)     耗時(shí) : 2218 ms     平均每秒 : 45085662

    java.version = 1.4.2_19
    JNIEnv讀取 (JavaVM)     耗時(shí) : 2234 ms     平均每秒 : 44762757


    為什么要做這個(gè)JNIEnv讀取測(cè)試:
     JavaVM是進(jìn)程全局有效的,而JNIEnv是線程相關(guān)的,
     但JNI編程是可以不用這樣的模式來(lái)獲得JNIEnv的,需要在所有相關(guān)的函數(shù)調(diào)用里帶JNIEnv參數(shù)。
     在C++編程模式下,大量的對(duì)象方法調(diào)用都要帶JNIEnv的參數(shù)確實(shí)不如動(dòng)態(tài)獲得它方便。
     在性能可以接受的范圍內(nèi)是可以考慮用其他的模式來(lái)隨時(shí)獲得JNIEnv的。因此我才會(huì)做這個(gè)測(cè)試。

     從上面的測(cè)試數(shù)據(jù)看,用線程變量的性能是優(yōu)于JavaVM.GetEnv的,而且從相對(duì)的數(shù)量級(jí)上看,個(gè)人認(rèn)為是完全可以接受這種JNIEnv的獲得模式的。

     

    希望以上的測(cè)試分析對(duì)大家的JNI應(yīng)用開(kāi)發(fā)和優(yōu)化有一定的參考價(jià)值。

     

    posted @ 2009-09-17 05:39 TaoLei 閱讀(4165) | 評(píng)論 (2)編輯 收藏

    java反編譯+UI輔助工具
    反編譯引擎是自己寫(xiě)的,一次發(fā)布到公共網(wǎng)絡(luò)上,
    UI輔助工具包含很多方便的功能,可以直接查看jar文件、可以模糊查找類名、查看繼承關(guān)系、查找引用、查找字符串等。
    歡迎大家去試用一下。

    第一次使用BlogJava,不知道怎樣提供下載地址,哪位朋友介紹一下
    http://www.tkk7.com/Files/taolei/classexplorer.zip

    如果這個(gè)不行可以在
    http://taolei.download.csdn.net/
    下載

    posted @ 2009-09-15 11:34 TaoLei 閱讀(1697) | 評(píng)論 (6)編輯 收藏
    主站蜘蛛池模板: 亚洲丝袜中文字幕| 亚洲综合综合在线| 免费无遮挡无遮羞在线看| 国产高清视频在线免费观看| 亚洲狠狠成人综合网| 成人最新午夜免费视频| 中文日韩亚洲欧美制服| 天天干在线免费视频| 亚洲av无码日韩av无码网站冲| 国产一区二区三区在线免费| 一级毛片免费视频网站| 亚洲区小说区图片区QVOD| 久久精品免费观看国产| 亚洲国产精品日韩在线观看| 毛片免费在线观看网址| 久久无码av亚洲精品色午夜 | 亚洲熟妇AV一区二区三区宅男| 在线看片免费不卡人成视频| 最新亚洲精品国偷自产在线| 四虎永久在线精品免费观看地址 | 免费毛片在线视频| 人与动性xxxxx免费| 亚洲av伊人久久综合密臀性色 | 亚洲国产精品免费视频| 亚洲1区1区3区4区产品乱码芒果| 天天摸夜夜摸成人免费视频| 免费人成视频在线观看免费| 久久精品国产亚洲| 免费羞羞视频网站| 免费看少妇高潮成人片| 亚洲国产成人精品电影| 亚洲av手机在线观看| 国产精品99久久免费观看| 亚洲精品成a人在线观看☆| 国产成人麻豆亚洲综合无码精品| 久久久久久国产精品免费无码| 亚洲精品无码一区二区| 亚洲国产a∨无码中文777| 免费精品人在线二线三线区别| 一级一级毛片免费播放| 亚洲不卡中文字幕|