在 91 版之前,Chrome 中的计时器分辨率在桌面设备上限制为 5 微秒(启用网站隔离)和 100 微秒(Android 上未启用)。
从版本 91 开始,根据规范变更,Chrome 将跨平台的显式计时器(performance.now()
、performance.timeOrigin
以及公开 DOMHighResTimestamps
的其他性能 API)的分辨率限制在 100 微秒以内。启用跨域隔离后,无论平台如何,网站都可以将限制放宽到 5 微秒。
通过启用跨域隔离功能获得更强大的功能,这是 SharedArrayBuffer
上采取的类似方法。跨域隔离是指将网页与其他源(选择启用源除外)隔离的状态。
我需要采取什么措施吗?
一般不会。在其他浏览器中,performance.now()
被限制为更加粗略的分辨率(例如,1 毫秒 = 0.001 秒),因此您不应依赖当前的分辨率。
同时,如果您希望提高计时器分辨率(例如为了更准确地测量性能)而受益,则需要确保您的网站已进行跨域隔离。这将为您提供 Chrome 和其他基于 Chromium 的浏览器以及 Firefox 的更好的分辨率。
计时器与跨域隔离有什么关系?
发现 Spectre 后,浏览器供应商决定将计时器限制为更粗略的分辨率(以及可用作隐式计时器的 SharedArrayBuffers 的可用性)。这是因为 Spectre 以及类似的推测执行攻击依靠计时器来测量某些操作所花费的时间,然后猜测进程内存中的内容。
虽然可以使用粗略计时器执行推测性执行攻击,但高分辨率计时器可以加快这些计时器的速度。 Chrome 使用其网站隔离架构和其他机制来降低风险并重新启用了这些功能,但仅限于桌面平台和 Chromium 浏览器。让 API 依赖底层浏览器架构并不理想。
跨域隔离为浏览器在隔离的环境中运行网页提供了标准基准,使其无法加载不自愿的跨源资源,因此不存在 Spectre 的风险。借助跨域隔离,我们现在可以允许页面访问高分辨率计时器、SharedArrayBuffer
以及在可以读取任意跨源数据的进程中不安全的其他 API。
如需详细了解此变更背后的背景,请参阅为什么需要“跨域隔离”才能实现强大的功能。
封面照片由 Linda Perez Johannessen 在 Unsplash 用户发布。