快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

乐虎唯一官方网站游戏:用JNI实现一个高精度的Java计时器



在Java法度榜样中,我们可以用System.currentTimeMillis()来计时,然则精度不高,在我的机子(Pentium M 1.5GHz, WinXP)上,精度小于10ms。经由过程一个简单的Java法度榜样,我们可以测试

public static void main(String[] args) {

long b乐虎唯一官方网站游戏egin = System.currentTimeMillis();

long current;

while (begin == (current = System.currentTimeMillis()))

;

System.out.println((current - begin) + " ms");

}

System.currentTimeMillis()大年夜约10ms才变更一次。

10ms的精度在很多环境下是不敷用的,比如开拓射击类游戏等等。而PC中自身计时器的精度要高很多,纵然是WindowsXP供给的计时器也要比Java的System.currentTimeMillis()高太多了。比如用Win3乐虎唯一官方网站游戏2的QueryPerformanceCounter函数,在我的机子上可以获得1ns的精度。谋略机越成长,软件使用硬件的水平和效率却越来越差,这一点在Java的身上体现的尤其严重,跟着多核CPU的遍及,这个问题还要进一步严重。

言归正传,我们来讲怎么使用QueryPerformanceCounter来实现一个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;

}

用法是,在开始点调用的timer.reset(), 停止时调用timer.getDuration()获得所用的光阴,单位是ms.一个timer的instance可以多次应用.

下面我们来看看这个计时器都多高的精度。

public class TimerTest {

public static void main(Str乐虎唯一官方网站游戏ing[] args) {

long f = Timer.QueryPerformanceFrequency();

long p = Timer.QueryPerformanceCounter();

long c;

while (p == (c = Timer.QueryPerformanceCounter()))

;

System.out.println(((c - p) * 1000000 / f) + " ns");

}

}

在同样的系统下,我获得1ns的精度.

这种措施的一个毛病当然是,它现在还只能在Windows下应用,假如有同伙乐意协助实现其余系统下的native代码的话,我会异常谢谢的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: