上一篇BLOG中,通过测试我们发现 JavaScript的时钟是16ms的间隔. 对于IE来说,每次总会发生16ms的间隔;对于firefox来说,会存在0ms的间隔. 对于后者,我曾解释说:可能是Java使用了自己的时钟.

先说第二种情况,对于firefox中的js引擎,我尚未去看代码,因此我只说"可能",但后来hax来说,firefox的JS引擎仍是C写的,这才想起的确如此.所以这里先说,我前面关于firefox的问题的解释是错的.

再说16ms的问题. 我其实也怀疑,为什么是16ms,而不是其它的什么值呢?

hax给了我很多信息.我这里来整理一下:

首先是取时间值.也就是我们在JavaScript中用new Date()得到时间值采用的方法其实是不准确的. 该值总会是15~16ms的间隔值,其原因在于:
---------------
Windows系统获取时间主要是用下面的几种方法
  一:GetTickCount()
      这个就是用的上篇里说的系统时钟中断
  Windows NT 3.5 及更高版本,精度为 10ms(100Hz)
  Windows NT 3.1 ,精度为 16ms(60Hz)
  Windows 95 及更高版本,精度为 55ms(18.2Hz)
  (对于Windows XP(NT5.0) 及更高版本,实测得的精度为 16ms)
  
  二:timeGetTime()
  精度约1ms(需通过其它API配合)

  三:High-Resolution Timer
      这种方法就使用了CPU的RTC
  QueryPerformanceCounter() 配合 QueryPerformanceFrequency(),适用于高精度应用场合

参见:http://www2.matrix.org.cn/thread.shtml?topicId=10491&forumId=1&fid=1
---------------
也就是说,如果JavaScript的new Date()采用getTickCount()来实现,那么它必然是返回16ms间隔的时间值的.
举例来说,你可能写一个超大循环用来收集一批Date()对象,最终你会发现,大多数时候是一样的值,而每两
批时间值的差值总在15~16ms.

接下说时间精度.也就是讨论setTimeout/setInterval()为什么是16ms,而另外一些人/资料会提及到10ms这个精度值.首先我们来看时钟的实现:
---------------
  一、使用系统时钟SetTimer()
  系统时钟是采用向窗体发WM_TIMER事件来激活处理例程的。而且同一个窗体消息队列中只允许同时存在一个WM_TIMER,因此它可能被丢失消息。

  二、使用timeSetEvent()
  可以使用timeSetEvent()来设置时钟。缺省情况下,他是16ms精度的。另外,同进程中同时最多有16个timeSetEvent()。

  三、在线程中使用sleep()
  Zhe曾用C代码做过测试,证明sleep()的精度是10ms。也就是说,sleep(1)产生的效果最低限也是10ms的间隔。

参见:http://dev.cbw.com/vc/progress/200510315005_4279849.shtml
---------------

timeSetEvent缺省情况下是16ms/10ms间隔的,更确切地说,是“对于Intel 芯片的精度为16ms,对于MIPS芯片的精度为10ms”。这一点在下面这份文档中有说明:
http://www.wanfangdata.com.cn/qikan/periodical.Articles/jdgc/jdgc99/jdgc9903/990318.htm

timeSetEvent()可以通过一些API:timeBeginPeriod()来调整计时精度。这一点请参考:
http://www.vckbase.com/document/viewdoc/?id=1234

最后,我们来讲结论。对于JavaScript来说,由于new Date()只需要得到毫秒值,并不需要过高的精度,因此最合理的方法当然是调用GetTickCount()来取值,而不是采QueryPerformanceCounter() 配合 QueryPerformanceFrequency()来得到高精度的时间值。由于GetTickCount()自身的限制,JavaScript的new Date()得到的时间隔是16ms精度的。——对于win98或其它系统来说,这个值可能是58ms/10ms。

对于定时器来说,JavaScript应该会是使用timeSetEvent()来做定时器。因为如果用线程+sleep()会存在较大的开销(事实上我出观察到线程计数是没有变化的),而采用SetTimer()会存在消息队列的问题。所以采用timeSetEvent()是最实际的方案。——至于16个timeSetEvent()的限制,可以通过同一个timeSetEvent()中处理多个例程来规避。因此,由于timeSetEvent()自身在缺省状态下的限制,因此导致了16m时间间隔。

对于FireFox中的和WebKit(safari)中的脚本引擎,因为是开源的,有兴趣的不妨自己读读相关的代码。就不再讲述了。

感谢Zhe和hax对我提供的帮助。本文基本上是资源整理贴。^.^

转载于:https://www.cnblogs.com/java0818/archive/2006/12/21/2144547.html

再谈JavaScript时钟中的16ms精度问题.相关推荐

  1. 再谈SQL Server中日志的的作用

    简介 之前我已经写了一个关于SQL Server日志的简单系列文章.本篇文章会进一步挖掘日志背后的一些概念,原理以及作用.如果您没有看过我之前的文章,请参阅: 浅谈SQL Server中的事务日志(一 ...

  2. 移花接木—— 再谈javascript中的 call 与 apply

    2019独角兽企业重金招聘Python工程师标准>>> 在JavaScript中,call 和 apply 是Function对象自带的两个方法,这两个方法的主要作用是改变函数中的t ...

  3. 【一次面试】再谈javascript中的继承

    前言 面向对象编程是每次面试必问的知识点,而前端js如何实现继承每次命中率高达80% 这不,近两天我们面试时候,同事就问道面试者此问题,但是,不论之前自己做的回答,还是面试者的回答,基本都不太令人满意 ...

  4. java数组去重_再谈JavaScript数组去重

    JavaScript的数组去重是一个老生常谈的话题了.随便搜一搜就能找到非常多不同版本的解法. 细想一下,这样一个看似简单的需求,如果要做到完备,涉及的知识和需要注意的地方着实不少. 定义重复(相等) ...

  5. 再谈javascript图片预加载经典技术

    图片预加载技术的典型应用: 如lightbox方式展现照片,无疑需要提前获得大图的尺寸,这样才能居中定位,由于javascript无法获取img文件头数据,必须等待其加载完毕后才能获取真实的大小然后展 ...

  6. this ts 方法获取_浅谈 JavaScript / TS 中的 this

    在 JavaScript 中 this 所指向的对象与运行时上下文进行绑定,这就会导致在不同场景下,函数最终运行结果可能不尽相同. 非对象/实例化环境 非对象/实例化环境指的是普通的函数( 没有通过原 ...

  7. 再谈隐藏进程中的DLL模块/黑月教主

    http://hi.baidu.com/_achillis/blog/item/59bf732623fbe509918f9d87.html 相当老的话题,大约一年前就写过这个东西了,不过那时候知识比较 ...

  8. 再谈Spring Boot中的乱码和编码问题

    编码算不上一个大问题,即使你什么都不管,也有很大的可能你不会遇到任何问题,因为大部分框架都有默认的编码配置,有很多是UTF-8,那么遇到中文乱码的机会很低,所以很多人也忽视了. Spring系列产品大 ...

  9. ajax 请求成功 再执行javascript,jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法...

    jquery中ajax请求后台数据成功后既不执行success也不执行error,此外系统报错:Uncaught SyntaxError: Unexpected identifier at Objec ...

最新文章

  1. Gym-100889B Backward and Forward
  2. FreeRTOS学习笔记之信号量
  3. 单核工作法18:简化协作(下)
  4. python中turtle画树_python中turtle可以画树吗?怎么画?
  5. Cable--新虚拟网络架构介绍
  6. 零成本兼职副业有哪些?
  7. 基于微服务和Docker的PaaS云平台架构设计
  8. java求最小步数_关于java:查找两点之间的最小步数?
  9. 2017年上半年软件设计师试题-04
  10. Flink 在 B 站的多元化探索与实践
  11. jQuery选择器--总结
  12. python安装后怎样配解释器_各个系统下的Python解释器相关安装方法
  13. rpg人物制作软件_RPG游戏制作教程
  14. 用python制作上海疫情评论词云图-自定义形状
  15. SMCJ6.0CA TVS二极管应用领域(瞬态抑制二极管)
  16. QQ大厅游戏 大家来找茬辅助
  17. linux离线安装字体
  18. 如何在线免费对PDF文档进行解密
  19. AtCoder Beginner Contest 224题解 A-G
  20. java 浏览器设置字体大小_Sass可以在不使用REM的情况下访问浏览器的默认字体大小吗?...

热门文章

  1. Android开发笔记(三十五)页面布局视图
  2. 查询目标服务器系统,查看目标服务器的操作系统
  3. java B2B2C springmvc mybatis电子商务平台源码-------zuul网关实现
  4. 无维护地稳定运行了8 年的 Hyperic HQ
  5. Android Studio 快捷键、Debug的使用
  6. KPN iTV的敏捷转型之旅
  7. python开发面向对象基础:封装
  8. WCF 安全性 之 None
  9. Essential SQLAlchemy2th学习笔记之反射Reflection
  10. Java设计模式—工厂方法模式抽象工厂模式