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

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

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

    gr8vyguy@Blogjava

    用JNI實現(xiàn)高精度的Java計時器(Java Timer)

    在Java程序中,我們可以用System.currentTimeMillis()來計時,但是精度不高,在我的機(jī)子(Pentium M 1.5GHz, WinXP)上,精度小于10ms。通過一個簡單的Java程序,我們可以測試

    public static void main(String[] args) {
            long begin = System.currentTimeMillis();
            
    long current;
            
    while (begin == (current = System.currentTimeMillis()))
                ;
            System.out.println((current 
    - begin) + " ms");
    }

    System.currentTimeMillis()大約10ms才變化一次。

    10ms的精度在很多情況下是不夠用的,比如開發(fā)射擊類游戲等等。而PC中自身計時器的精度要高很多,即使是WindowsXP提供的計時器也要比Java的System.currentTimeMillis()高太多了。比如用Win32的QueryPerformanceCounter函數(shù),在我的機(jī)子上可以得到1ns的精度。計算機(jī)越發(fā)展,軟件利用硬件的程度和效率卻越來越差,這一點在Java的身上表現(xiàn)的尤其嚴(yán)重,隨著多核CPU的普及,這個問題還要進(jìn)一步嚴(yán)重。

    言歸正傳,我們來講怎么利用QueryPerformanceCounter來實現(xiàn)一個native的Java計時器.
    package cn.pandaoen.timer;

    /**
     * A Timer class uses native methods to measure times.
     *  
     * 
    @author pan
     
    */
    public class Timer {

        
    private long prev;

        
    public void reset() {
            prev 
    = QueryPerformanceCounter();
        }

        
    /**
         * 
    @return the duration in ms from the point of reset()
         
    */
        
    public double getDuration() {
            
    long current = QueryPerformanceCounter();
            
    return (current - prev) / frequency;
        }

        
    static final double frequency;

        
    static native long QueryPerformanceFrequency();

        
    static native long QueryPerformanceCounter();

        
    static {
            System.loadLibrary(
    "extension");
            frequency 
    = QueryPerformanceFrequency() / 1000.0;
        }
    }

    Native的代碼
    #include "cn_pandaoen_timer_Timer.h"
    #include 
    <windows.h>

    JNIEXPORT jlong JNICALL
    Java_cn_pandaoen_timer_Timer_QueryPerformanceFrequency(JNIEnv 
    *e, jclass cls)
    {
        LARGE_INTEGER frequency;
        QueryPerformanceFrequency(
    &frequency);
        
    return (jlong)frequency.QuadPart;
    }

    JNIEXPORT jlong JNICALL
    Java_cn_pandaoen_timer_Timer_QueryPerformanceCounter(JNIEnv 
    *e, jclass cls)
    {
        LARGE_INTEGER counter;
        QueryPerformanceCounter(
    &counter);
        
    return (jlong)counter.QuadPart;
    }

    用法是,在開始點調(diào)用的timer.reset(), 結(jié)束時調(diào)用timer.getDuration()得到所用的時間,單位是ms.一個timer的instance可以多次使用.

    下面我們來看看這個計時器都多高的精度。
    public class TimerTest {
        
    public static void main(String[] args) {
            
    long f = Timer.QueryPerformanceFrequency();
            
    long p = Timer.QueryPerformanceCounter();
            
    long c;
            
    while (p == (c = Timer.QueryPerformanceCounter()))
                ;
            System.out.println(((c 
    - p) * 1000000 / f) + " ns");
        }
    }
    在同樣的系統(tǒng)下,我得到1ns的精度.

    這種方法的一個缺點當(dāng)然是,它現(xiàn)在還只能在Windows下使用,如果有朋友愿意幫忙實現(xiàn)別的系統(tǒng)下的native代碼的話,我會非常感謝的。

    代碼  timer.rar

    轉(zhuǎn)載請保留http://m.tkk7.com/xilaile/archive/2007/02/24/100441.html

    posted on 2007-02-23 22:49 gr8vyguy 閱讀(7856) 評論(3)  編輯  收藏 所屬分類: Java

    評論

    # re: 用JNI實現(xiàn)高精度的Java計時器(Java Timer)[未登錄] 2007-11-15 12:17 liu

    沒有cn_pandaoen_timer_Timer.h
    timer.rar的代碼下不下來,能否發(fā)到我的郵箱,多謝
    crazycowliu@sina.com  回復(fù)  更多評論   

    # re: 用JNI實現(xiàn)高精度的Java計時器(Java Timer)[未登錄] 2007-11-15 12:46 liu

    不好意思,才知道要用javah生成.h文件...  回復(fù)  更多評論   

    # re: 用JNI實現(xiàn)高精度的Java計時器(Java Timer)[未登錄] 2013-07-30 17:19 Kent

    代碼結(jié)果是微秒級,不是納秒級。
    測試代碼
    f = Timer.QueryPerformanceFrequency();
    是每秒counter數(shù),并不是毫秒。
    故乘1000000表示微秒,不是納秒。
      回復(fù)  更多評論   

    <2007年2月>
    28293031123
    45678910
    11121314151617
    18192021222324
    25262728123
    45678910

    導(dǎo)航

    統(tǒng)計

    公告

  • 轉(zhuǎn)載請注明出處.
  • msn: gr8vyguy at live.com
  • 常用鏈接

    留言簿(9)

    隨筆分類(68)

    隨筆檔案(80)

    文章分類(1)

    My Open Source Projects

    搜索

    積分與排名

    最新評論

    主站蜘蛛池模板: 亚洲视频在线免费看| 成人精品视频99在线观看免费| 亚洲w码欧洲s码免费| 亚洲高清在线观看| 三年片在线观看免费大全电影| 国产∨亚洲V天堂无码久久久| 叮咚影视在线观看免费完整版| 国产亚洲av片在线观看播放 | 无遮挡国产高潮视频免费观看| 永久黄网站色视频免费观看| 亚洲av日韩综合一区久热| 四虎影永久在线高清免费| 男女超爽视频免费播放| 国产91精品一区二区麻豆亚洲| fc2免费人成在线| 亚洲人成人一区二区三区| 91精品国产免费| 亚洲人成色77777在线观看 | 亚洲欧洲精品无码AV| 一区二区在线免费观看| 亚洲国产精品乱码在线观看97| 日韩免费a级毛片无码a∨| 亚洲成a人无码亚洲成www牛牛 | 3344免费播放观看视频| 在线观看日本亚洲一区| 亚洲国产成人精品无码久久久久久综合| 日韩在线视频线视频免费网站| 日韩亚洲人成在线综合日本| 亚洲美女免费视频| 色九月亚洲综合网| 亚洲AV无码一区东京热久久| 无码国产精品一区二区免费式直播| 亚洲AV无码男人的天堂| 亚洲成AV人片在线播放无码| 美女视频黄免费亚洲| 成年免费大片黄在线观看com| 亚洲AV本道一区二区三区四区| 好爽又高潮了毛片免费下载| 国产高清对白在线观看免费91| 亚洲图片中文字幕| 亚洲人成网站在线观看青青|