<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()來計時,但是精度不高,在我的機子(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ù),在我的機子上可以得到1ns的精度。計算機越發(fā)展,軟件利用硬件的程度和效率卻越來越差,這一點在Java的身上表現(xiàn)的尤其嚴(yán)重,隨著多核CPU的普及,這個問題還要進一步嚴(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://www.tkk7.com/xilaile/archive/2007/02/24/100441.html

    posted on 2007-02-23 22:49 gr8vyguy 閱讀(7848) 評論(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| 亚洲AV无码成人精品区在线观看 | 亚洲av无码一区二区三区网站| 中文字幕一区二区免费| 亚洲日韩v无码中文字幕| 岛国岛国免费V片在线观看| 国精无码欧精品亚洲一区| 中文无码成人免费视频在线观看| 亚洲人成人一区二区三区| 久久国产乱子免费精品| 久久亚洲精品成人| 91免费国产在线观看| 亚洲精品精华液一区二区| 免费观看亚洲人成网站| 青娱乐免费视频在线观看| 亚洲精品无码久久久久久| 伊在人亚洲香蕉精品区麻豆| 岛国精品一区免费视频在线观看| 亚洲国产成人高清在线观看| 91久久成人免费| 亚洲AV无码专区亚洲AV桃| 亚洲精品天堂成人片?V在线播放| 91免费福利视频| 国产精品亚洲四区在线观看| 国产一区二区三区无码免费| 中文字幕无码毛片免费看| 亚洲人成在线免费观看| 日本免费观看网站| 久久免费美女视频| 亚洲国产成人99精品激情在线| yy6080亚洲一级理论| 最近免费mv在线电影| 美国毛片亚洲社区在线观看| 亚洲精品无码专区在线在线播放 | 一级黄色免费毛片| 四虎影视免费永久在线观看 | 中字幕视频在线永久在线观看免费| 亚洲国产精品不卡在线电影| 黄瓜视频高清在线看免费下载| 五月婷婷免费视频|