关于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就很直接方便了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值