形势
在编写高性能JavaScript代码时,Chrome等人提供的标准分析工具并不总是足够的。它们似乎只提供功能级别的粒度,深入挖掘并找到我需要的信息可能很费时。
在.NET中,StopWatch类给出了我所需要的精确信息:任意代码片段的亚微秒分辨率定时。
对于JavaScript来说,performance.now()曾经是衡量性能的一种很好的方法,但为了应对光谱仪和崩溃,所有主流浏览器都将分辨率降低到不到一毫秒。
在performance.now()上引用MDN
时间戳实际上不是高分辨率的。为了减轻安全威胁,如谱,浏览器目前围绕的结果在不同程度上。(Firefox 59中的Firefox开始舍入2毫秒。)一些浏览器也可能稍微随机地设置时间戳。在未来的版本中,精确度可能会再次提高;浏览器开发人员仍在研究这些定时攻击以及如何最好地减轻它们。
问题所在
我需要微秒的精确计时。在编写本报告时,浏览器似乎没有提供任何选项或标志来禁用这些安全度量。也许我搜索错了术语,但我遇到的唯一文章是对安全问题的解释以及这些缓解措施是如何解决它们的。
我对安全性方面不感兴趣--我在测试性能--在我自己的机器上,关键的JavaScript代码片段,而我唯一关心的是,我用尽可能少的努力获得尽可能精确的度量。
现有的解决办法
我想到了两个选择:
例如,我必须将旧版本的FireFox用于基准测试,并将新版本的Chrome用于浏览。这是不切实际的,因为我需要在所有浏览器中进行测试(最好也可以在所有浏览器中进行基准测试)。另外,新的优化不会在旧浏览器中实现,因此基准测试可能是无用的。
在这方面,我看过很多老的博客文章,但似乎没有一篇能达到我所需要的高精度(毕竟,曾经有过performance.now() )。
问题是
如何在不需要使用旧的浏览器版本、虚拟机等的情况下,有效地获得预谱performance.now() ?。
在JavaScript中是否有任何实现微秒精度的编码技术或库?
上述3种浏览器是否有禁用这些安全措施的选项或标志?
我最终是在寻找一种方法来精确地测量不同代码段之间的相对性能--因此,如果有一种解决方案可以给我带来滴答,而不是微秒,那么只要它是准确的,并且在浏览器中工作,这是可以接受的。
发布于 2018-06-26 23:01:54
火狐确实有一个名为privacy.reduceTimerPrecision的配置设置,它禁用谱缓解功能。您可以使用Firefox的about:config页面(在地址栏中键入about:config )将其转换为false。
这是通过MDN上的一个提示发现的。
发布于 2021-01-29 18:20:52
从Firefox 79开始,如果让服务器在页面中发送两个标头,则可以使用高分辨率计时器:
从Firefox 79开始,如果跨源使用
Cross-Origin-Opener-Policy和Cross-Origin-Embedder-Policy标头隔离文档,则可以使用高分辨率计时器: 跨源-开放-政策:相同-来源交叉-嵌入-政策:要求-公司 这些标题确保顶级文档不会与跨源文档共享浏览上下文组。COOP进程--将您的文档隔离开来,而潜在的攻击者如果在弹出窗口中打开它,则无法访问您的全局对象,从而防止了一组名为XS-泄漏的跨源攻击。 参考文献:https://developer.mozilla.org/en-US/docs/Web/API/Performance/now
到目前为止还没有在页面上提到,但是通过一个小实验,我得出的结论是,计时器的精度是20秒,其中有那些标头,这比默认情况下得到的精度高出50倍。
(() => {
const start = performance.now();
let diff;
while ((diff = performance.now() - start) === 0);
return diff;
})();对于这些标头,这将返回0.02或一个非常接近0.02的值,而1没有。
https://stackoverflow.com/questions/50117537
复制相似问题