hax的技术部落格

Return of Hax

关于JavaScript的时间精度

对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
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

关于JavaScript的时间精度

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭