网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.small 方法.
.Java Portlet规范的参考实现-Plu.
.使用UML编写Java应用程序 (2)实现.
.转:《学不会的JAVA,消不了的忧.
.SUN宣布发布更多免费软件.
.如何用 servlet 打开非 HTML 格式.
.Resin的使用和安装(4).
.用JAVA将大图片文件转换出小的缩.
.Struts HOW-TO 系列 之数据库访问.
.后向引用.
.HelloWorld问题集锦.
.Liferay中整合tinyMCE详解.
.使用ActionHandler进行WEB应用编.
.Java程序中如何执行其他的程序.
.Java实时多任务调度过程中的安全.
.VJ6.0的使用方法(1)概述、VJ6的获.
.JBuilder2005单元测试之捆绑多个.
.系统构建高性能J2EE应用的五种核.
.ANT十五大最佳实践.
.GetTempName 方法.

用JNI实现一个高精度的Java计时器

发表日期:2008-1-5


    在Java程序中,我们可以用System.currentTimeMillis()来计时,但是精度不高,在我的机子(Pentium M 1.5GHz, WinXP)上,精度小于10ms。通过一个简单的Java程序,我们可以测试


Code highlighting prodUCed by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->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的精度在很多情况下是不够用的,比如开发射击类游戏等等。而PC中自身计时器的精度要高很多,即使是WindowsXP提供的计时器也要比Java的System.currentTimeMillis()高太多了。比如用Win32的QueryPerformanceCounter函数,在我的机子上可以得到1ns的精度。计算机越发展,软件利用硬件的程度和效率却越来越差,这一点在Java的身上表现的尤其严重,随着多核CPU的普及,这个问题还要进一步严重。

言归正传,我们来讲怎么利用QueryPerformanceCounter来实现一个native的Java计时器.

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->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的代码

上一篇:CGLib实现变化字段探测的供能 人气:899
下一篇:SWT中模拟AWT的BorderLayout 人气:645
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐