现在有一种在 javascript 中测量微秒的新方法:
http://gent.ilcore.com/2012/06/better-timer-for-javascript.html
但是,在过去,我发现了一种粗略的方法,可以在 JavaScript 中从毫秒计时器中获得 0.1 毫秒的精度。不可能的?没有。继续阅读:
我正在做一些需要自检计时器精度的高精度实验,发现我能够在某些系统上的某些浏览器上可靠地获得 0.1 毫秒的精度。
我发现在快速系统上的现代 GPU 加速网络浏览器中(例如 i7 四核,其中几个核心处于空闲状态,只有浏览器窗口)——我现在可以相信计时器是毫秒级的。事实上,它在空闲的 i7 系统上变得如此准确,我已经能够可靠地获得完全相同的毫秒,超过 1,000 次尝试。只有当我尝试执行诸如加载额外网页或其他操作时,毫秒精度才会降低(并且我能够通过前后时间检查成功地捕捉到我自己降低的精度,看看是否我的处理时间突然延长到 1 毫秒或更多毫秒 - 这有助于我使可能受到 CPU 波动不利影响的结果无效)。
它在 i7 四核系统上的某些 GPU 加速浏览器中变得如此准确(当浏览器窗口是唯一窗口时),我发现我希望我可以在 JavaScript 中访问一个 0.1 毫秒精度的计时器,因为准确度现在终于出现在一些高端浏览系统上,使这种计时器精度对于某些需要高精度的小众应用程序来说是值得的,并且应用程序能够自我验证精度偏差。
显然,如果您要进行多次传递,您可以简单地运行多次传递(例如 10 次传递),然后除以 10 以获得 0.1 毫秒的精度。这是获得更好精度的常用方法 - 进行多次传递,然后将总时间除以传递次数。
但是...如果由于异常独特的情况而只能通过特定测试的单个基准测试,我发现这样做可以获得 0.1(有时是 0.01 毫秒)的精度:
初始化/校准:
- 运行繁忙循环以等待计时器递增到下一个毫秒(将计时器与下一个毫秒间隔的开始对齐)此繁忙循环持续不到一毫秒。
- 在等待定时器递增时,运行另一个繁忙循环以递增计数器。计数器告诉您在一毫秒内发生了多少计数器增量。这个繁忙的循环持续一整毫秒。
- 重复上述操作,直到数字变得超稳定(加载时间、JIT 编译器等)。 4. 注意:数字的稳定性可以让您在空闲系统上达到可达到的精度。如果您需要自检精度,您可以计算方差。某些浏览器的差异较大,而其他浏览器的差异较小。在较快的系统上较大,在较慢的系统上较慢。一致性也不同。您可以分辨出哪些浏览器比其他浏览器更一致/更准确。较慢的系统和繁忙的系统将导致初始化通道之间的差异更大。如果浏览器没有为您提供足够的精度以允许 0.1 毫秒或 0.01 毫秒的测量,这可以让您有机会显示警告消息。计时器偏差可能是一个问题,但某些系统上的某些整数毫秒计时器会非常准确地递增(非常准确),这将导致您可以信任的非常一致的校准值。
- 保存最终计数器值(或最后几次校准通过的平均值)
以亚毫秒精度为基准:
- 运行繁忙循环以等待计时器递增到下一个毫秒(将计时器对齐到下一个毫秒间隔的开始)。这个繁忙的循环持续不到一毫秒。
- 执行您想要精确基准时间的任务。
- 检查计时器。这为您提供整数毫秒。
- 在等待计时器递增时,运行最后一个繁忙循环以递增计数器。这个繁忙的循环持续不到一毫秒。
- 将此计数器值除以初始化时的原始计数器值。
- 现在你得到了毫秒的小数部分!!!!!!!!!
警告:不建议在网络浏览器中使用繁忙循环,但幸运的是,这些繁忙循环每次运行的时间不到 1 毫秒,并且只运行几次。
JIT 编译和 CPU 波动等变量会增加大量的不准确性,但如果您运行多次初始化过程,您将获得完整的动态重新编译,最终计数器会稳定到非常准确的值。确保所有繁忙循环对于所有情况都是完全相同的功能,以便繁忙循环的差异不会导致差异。在开始信任结果之前,请确保所有代码行都执行了多次,以使 JIT 编译器已经稳定到完全动态重新编译 (dynarec)。
事实上,我在某些系统上目睹了接近微秒的精度,但我还不相信它。但是 0.1 毫秒的精度在我是唯一浏览器页面的空闲四核系统上似乎工作得相当可靠。我遇到了一个科学测试案例,我只能一次性通过(由于发生了独特的变量),并且需要精确计时每次通过,而不是平均多次重复通过,所以这就是我这样做的原因。
我做了几次 pre-pass 和 dummy pass(也是为了稳定 dynarec),以验证 0.1ms 精度的可靠性(保持稳定几秒钟),然后在基准测试发生时让我的手离开键盘/鼠标,然后进行了几次后期处理以验证 0.1ms 精度的可靠性(再次保持稳定)。这也验证了诸如电源状态更改或其他东西之类的事情在前后之间没有发生,从而干扰了结果。在每个基准测试通过之间重复前测和后测。在此基础上,我几乎可以肯定两者之间的结果是准确的。当然,这不能保证,但它表明在网络浏览器中某些情况下准确的
这种方法只在非常非常利基的情况下有用。即便如此,它实际上也不是 100% 无限保证的,你可以获得非常值得信赖的准确度,甚至是结合多层内部和外部验证的科学准确度。