Javascript 为桌面创建具有高时间精度的时间敏感浏览器应用程序的最佳方法?

Javascript 为桌面创建具有高时间精度的时间敏感浏览器应用程序的最佳方法?,javascript,web-applications,browser,timer,Javascript,Web Applications,Browser,Timer,我必须开发一个应用程序,需要在一系列实验中测量用户响应时间。该应用程序将在大约100台计算机上运行,因此我提到了基于浏览器的方法可能是减少执行安装和更新的最佳方法。话虽如此,现在我已经了解了浏览器中计时器的准确性,特别是javascript计时器,我了解到可能存在从几毫秒到10-15毫秒以上的延迟。当用户测量他们对屏幕上的可视队列的响应时间时,这种延迟会对这些实验的精度产生负面影响 有没有一种已知的方法可以通过javascript为浏览器中运行的web应用程序获取精确的计时器?类似地,其中一些实

我必须开发一个应用程序,需要在一系列实验中测量用户响应时间。该应用程序将在大约100台计算机上运行,因此我提到了基于浏览器的方法可能是减少执行安装和更新的最佳方法。话虽如此,现在我已经了解了浏览器中计时器的准确性,特别是javascript计时器,我了解到可能存在从几毫秒到10-15毫秒以上的延迟。当用户测量他们对屏幕上的可视队列的响应时间时,这种延迟会对这些实验的精度产生负面影响


有没有一种已知的方法可以通过javascript为浏览器中运行的web应用程序获取精确的计时器?类似地,其中一些实验需要简单的2d动画,例如查看用户可以将鼠标光标停留在旋转立方体上多长时间。我更喜欢使用HTML5和Javascript,我们不能使用flash。

没错,你不能依赖计时器的间隔,但你可以依赖一个新的日期对象。例如:

var previousTime = new Date().getTime(); // returns milliseconds of "now"

var timer = setInterval( function() {
   var currentTime = new Date().getTime();
   var millisecondsSinceLastUpdate = currentTime - previousTime;
   previousTime = currentTime;
   alert( 'milliseconds since last update: ' + millisecondsSinceLastUpdate );
}, 1 );

正如@dqhendricks所建议的,您应该使用一个新的
Date
对象。但是,如果您需要保持一致性和准确性,则需要在同一台计算机上以相同的浏览器版本运行,并且在后台不运行任何内容

在firefox和chrome中查看这一点。点击边缘并尽可能快地将光标移出-我在FF中能得到的最低值是6毫秒,在Chrome中能得到的最低值是42毫秒

这些值在不同机器之间的差异甚至更大。我设置了一个有512MB内存和50%单核容量的虚拟机,在FF中打开了5个标签并尝试了测试——我得到的最低值是52MS


因此,除非你能控制用户的浏览器、电脑和后台运行的东西,否则我不会指望数据是准确的。

如果你有新的浏览器,你可以使用performance.now(),它比Date对象更精确,但使用浏览器的其他性能问题仍然适用:(


您根本不能依赖javascript。1)javascript日期(和计时器)基于系统时间。如果用户更改了系统时间,javascript就没有真正的方法知道。例如,如果您有一个1分钟的倒计时,启动它,然后用户将其时间设置回30分钟,计时器现在大约为31分钟。请参见:另一个问题是,浏览器中使用复杂的javascript控制台(以及像greasemonkey这样的插件),用户可以替换部分javascript来调整对他们有利的时间。如果你看一下他引用的javascript演示[link],这个例子使用currenttime减去前一次,就像你提到的那样。演示表明,在不同的浏览器中,它会给出不同的响应时间。代码的执行有延迟,并不准确。@EUTHYFRO仅仅因为实验中有不同的时间,并不意味着计算的时间差不准确…@EUTHYFRO例如,如果您使用计算的时间在浏览器上移动精灵,使用的距离为(通过的时间*速度)对于动画的每一帧,无论系统如何,精灵都会以相同的速度移动。唯一的漏洞是用户干扰了系统时钟。问题是每个浏览器的执行时间不同,因此一个浏览器可能会比另一个浏览器更快地执行javascript代码行,在这种情况下,它们不会以相同的速度移动同样的速度。我理解你的意思,但问题是javascript没有编译,浏览器在运行时读取脚本,据我理解,一些浏览器可以比其他浏览器更快地读取脚本。例如,如果你有var aTime=new Date().getTime();/*插入100行代码*/var bTime=new Date().getTime()();var executionTime=bTime-aTime;(见下一篇文章,空间不足)不同浏览器(chrome、FF、IE)的最终结果不同。这对我来说是个问题,因为它不能根据用户对屏幕上显示内容的响应速度准确地给出响应时间。如果一个浏览器在执行javascript时表现不佳,那么它会搞砸实验,给出不准确的时间,因为其中一部分时间用于通过浏览器执行效率低下的javascript,这会影响读取的时间。计算出的时间仍然是准确的。我不明白你想用这个实验证明什么。基本上你是说不同的浏览器执行某些操作需要不同的时间量。这并不意味着计算出的时间差是不准确的。@dqhendricks我在t下他假定您将比较用户之间的响应时间,但由于变量(浏览器、计算机等),您无法进行准确的比较。