Fre*_*ver 7 javascript performance benchmarking
在编写高性能JavaScript代码时,Chrome等人提供的标准分析工具并不总是足够的.它们似乎只提供功能级粒度,向下钻取并找到我需要的信息可能非常耗时.
在.NET中,StopWatch该类给出了我所需要的:任意代码段的亚微秒分辨率计时.
对于performance.now()曾经是衡量性能的好方法,但是为了响应Spectre和Meltdown,所有主流浏览器都将分辨率降低到甚至不到一毫秒.
在performance.now()上引用MDN :
时间戳实际上不是高分辨率.为了缓解诸如Spectre之类的安全威胁,浏览器目前对结果进行不同程度的舍入.(Firefox在Firefox 59中开始四舍五入到2毫秒.)有些浏览器也可能会略微随机化时间戳.在未来的版本中,精度可能会再次提高; 浏览器开发人员仍在调查这些时间攻击以及如何最好地缓解它们.
我需要微秒精度计时.在撰写本文时,浏览器似乎没有提供任何选项或标志来禁用这些安全性测量.也许我在谷歌搜索错误的条款,但我遇到的唯一文章是安全问题的解释以及这些缓解如何解决它们.
我对这里的安全方面不感兴趣 - 我在我自己的机器上对性能关键的JavaScript代码进行基准测试,我唯一关心的是尽可能少的努力获得尽可能准确的测量.
我想到两个选择:
我必须将旧版本的FireFox用于基准测试,并将新版Chrome浏览器用于浏览.这是不切实际的,因为我需要在所有浏览器中进行测试(最好还是在所有浏览器中进行测试).此外,旧的浏览器中没有实现新的优化,因此基准测试可能无用.
我已经看过各种较老的博客文章,但它们似乎都没有达到我所需要的高精度(毕竟,过去曾经有performance.now()过).
如何在performance.now()不必使用旧浏览器版本,虚拟机等的情况下获得有效的前幽灵?
JavaScript中是否有任何编码技术或库可以实现微秒精度?
上述3个浏览器是否有禁用这些安全措施的选项或标志?
我最终寻找一种方式来精确测量不同的代码片段进行相互比较的相对性能-所以如果有,让我蜱,而不是微秒的解决方案,这将是可以接受的过,只要它是准确和适用于浏览器.
从 Firefox 79 开始,如果您让服务器随页面发送两个标头,则可以使用高分辨率计时器:
\n\n\n\n
Cross-Origin-Opener-Policy从 Firefox 79 开始,如果您使用和标头跨源隔离文档,则可以使用高分辨率计时器Cross-Origin-Embedder-Policy:Run Code Online (Sandbox Code Playgroud)\nCross-Origin-Opener-Policy: same-origin\nCross-Origin-Embedder-Policy: require-corp\n这些标头确保顶级文档不会与跨源文档共享浏览上下文组。COOP 进程隔离您的文档,潜在的攻击者如果在弹出窗口中打开它,就无法访问您的全局对象,从而防止一系列被称为 XS-Leaks 的跨源攻击。
\n参考:https://developer.mozilla.org/en-US/docs/Web/API/Performance/now
\n
截至目前,该页面上尚未提及这一点,但通过一些实验,我得出结论,在存在这些标头的情况下,计时器的精度为 20\xc2\xb5s,这比您的精度高 50 倍默认获取。
\n(() => {\n const start = performance.now();\n let diff;\n while ((diff = performance.now() - start) === 0);\n return diff;\n})();\nRun Code Online (Sandbox Code Playgroud)\n如果有这些标头,则返回 0.02 或非常接近 0.02 的值;如果没有,则返回 1。
\n