关于JavaScript的时间精度

原创 2006年12月19日 19:51:00

对aimingoo的JavaScript时钟间隔的问题~一文的回复:

12月21日更新:aimingoo又写了一个总结,从底层上解释了16ms的原因。

时间间隔是约数,通常会认为在10ms-20ms之间,来源应该是win的时钟限制。为什么没有人确切的说是16ms?因为这个16ms来源于不准确的new Date!

function test() {
    var dates = [];
    var d = new Date();
    count = 0;
    while (count < 10) {
        var x = new Date();
        var t = x.getTime() - d.getTime();
        if (t > 0) {
            dates.push(t);
            d = x;
            count++;
        }
    }
    alert(dates);
}

上面这个test在xp下运行,也是打印出15,16...。也就是时钟精度就只有这点。
但是放到vista上看就会发现不同了,会出现1,1,1,1...,说明vista上的时钟精度提高了!但是setInterval的结果是形如16,3,18,16,13,18,13,17,21,9,8,22,1,6...这样的。

所以,xp系统上的16ms间隔反映的是时钟精度,而不是真实的interval间隔值,真实的间隔值可能是一个难以度量的随机值。

在ff上出现0的情况,并不是因为java的问题(ff可以不启用java的),而是因为ff允许0间隔(即与ie不一样,如setInterval可以设0ms),比方说前一个任务做了太久后面一个会立即跟上,而ie和opera至少休息一个周期。

BTW,实际上setTimeout和setInterval的实现上当无差异,之所以不同是因为我们代码书写方式的不同,假如习惯于在干活的代码之前而不是之后写下一个setTimeout,那可能就没有差别了。反之,在干活后setTimeout可以确保出让足够的cpu时间,而setInternal就可能始终霸占着cpu。如果要做一个给其他人用的任务调度器,则就应该使用setTimeout。比如说做动画效果的timeline,我倾向于使用单一的setTimeout来构建任务队列,然后执行动画运算时,根据当前时间来计算,而不是帧数,这样在cpu不行的情况下,就类似于跳帧的效果。如果自己执行一些单纯的小任务,能保证不会耗费过多cpu,用setInterval就很直接方便了。

js中取得不同精度的时间,时间戳,时间差的方法

http://blog.csdn.net/kingviker/article/details/7951106 http://jimliu.net/2014/03/16/hrt-in-js/ h...
  • tiangej
  • tiangej
  • 2017年09月08日 09:38
  • 124

YDT 2375-2011 高精度时间同步技术

  • 2017年08月02日 10:45
  • 9.06MB
  • 下载

C++中获得CPU高精度时间戳

对关注性能的程序开发人员而言,一个好的计时部件既是益友,也是良师。计时器既可以作为程序组件帮助程序员精确的控制程序进程,又是一件有力的调试武器,在有经验的程序员手里可以尽快的确定程序的性能瓶颈,或者对...
  • webols
  • webols
  • 2011年09月10日 00:45
  • 695

Linux下的高精度时间获得与定时器

    本文主要介绍Linux下高精度时间函数,及相关的具有超时机制的函数,对定时器也进行简单的介绍。    在linux下通常可用的精度最高的时间接口是gettimeofday,它返回一个timev...
  • zzulp
  • zzulp
  • 2011年04月01日 10:34
  • 1281

时间精度分析软件 V2.1.20151210

  • 2017年02月26日 20:13
  • 1.63MB
  • 下载

iOS封装定位类库,可自定义采集精度、超时时间、有效距离等功能

本文所使用的定位为iOS系统原生定位,使用前需导入 CoreLocation.framework框架 现在越来越多的项目中都会或多或少的使用到定位功能,而有些时候并不是拿到了用户的当前坐标就可以了,而...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于JavaScript的时间精度
举报原因:
原因补充:

(最多只允许输入30个字)