首页 > 解决方案 > 自 Spectre 和 Meltdown 以来如何在 JavaScript 中获得微秒计时

问题描述

情况

在编写高性能 JavaScript 代码时,Chrome 等人提供的标准分析工具并不总是足够的。它们似乎只提供功能级别的粒度,并且深入查找我需要的信息可能非常耗时。

在 .NET 中,StopWatch该类提供了我所需要的东西:任意代码片段的亚微秒分辨率时间。

JavaScriptperformance.now()曾经是衡量性能的一个很好的方法,但为了响应 Spectre 和 Meltdown,所有主要浏览器都将分辨率降低到甚至不到一毫秒。

performance.now()上引用 MDN :

时间戳实际上不是高分辨率的。为了缓解 Spectre 等安全威胁,浏览器目前在不同程度上对结果进行了四舍五入。(Firefox 在 Firefox 59 中开始舍入到 2 毫秒。)一些浏览器也可能稍微随机化时间戳。在未来的版本中,精度可能会再次提高;浏览器开发人员仍在研究这些定时攻击以及如何最好地缓解它们。

问题

我需要微秒精度的计时。在撰写本文时,浏览器似乎没有提供任何选项或标志来禁用这些安全措施。也许我在谷歌上搜索了错误的术语,但我遇到的唯一文章是对安全问题的解释以及这些缓解措施如何解决这些问题。

我对这里的安全性方面不感兴趣——我在我自己的机器上对性能关键的 JavaScript 代码片段进行基准测试,我唯一关心的是我以尽可能少的努力获得尽可能准确的测量结果。

现有的解决方法

想到两个选择:

  1. 安装未实施这些缓解措施的旧版浏览器

例如,我必须将旧版本的 FireFox 用于基准测试,而将新版本的 Chrome 用于浏览。这是不切实际的,因为我需要在所有浏览器中进行测试(最好在所有浏览器中进行基准测试)。此外,新的优化没有在旧浏览器中实现,因此基准测试可能毫无用处。

  1. 使用 WebWorkers 实现自定义计时器

我已经看过各种关于此的较早的博客文章,但似乎都没有达到我需要的高精度(毕竟,曾经有过performance.now())。

问题

我如何获得有效的 pre-Spectreperformance.now()而无需求助于较旧的浏览器版本、虚拟机等?

JavaScript 中是否有任何编码技术或库可以达到微秒级精度?

上述 3 种浏览器是否有任何选项或标志可以禁用这些安全措施?

我最终正在寻找一种方法来准确测量不同代码段之间的相对性能 - 因此,如果有一种解决方案可以给我滴答声,而不是微秒,那么只要它是准确的,那也是可以接受的并且跨浏览器工作。

标签: javascriptperformancebenchmarking

解决方案


Firefox 确实有一个名为privacy.reduceTimerPrecision禁用 Spectre 缓解的配置设置。about:config您可以使用 Firefox 的 about:config 页面(在地址栏中输入)将其切换为 false 。

通过MDN上的提示弄清楚了这一点。


推荐阅读