前端性能揭秘
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

performance.now()方法

为了测算一个任务的耗时,最容易想到的方式是先分两次调用Date.now()方法,然后做差值来衡量过程中消耗的时间。

这种方式存在以下两个问题。

● 在部分场景(如游戏、Benchmark等)下的精度不够,只能精确到毫秒(ms)。

● 使用Date.now()方法获取的是时间戳(1970年到现在经过的秒数),它依赖于用户端操作系统的时间。如果用户记录了startTime并修改了本地时间,就会出现任务耗时异常的情况(虽然这种情况并不常见)。

Benchmark(基准测试)是一种测试性能的方式,如通过短时间内运行多次一个函数来测试调用其所耗费的时间。因为函数单次执行耗时一般很少,所以Benchmark对于时间的精度要求很高。

为了提供更高精度、更可靠的性能计时,Performance API提供了performance.now()方法。performance.now()方法具有以下特性。

● 精度精确到微秒(μs)。

● 获取的是把页面打开时间点作为基点的相对时间,不依赖操作系统的时间。

使用performance.now()方法和Date.now()方法的差异如图2-4所示。

图2-4 使用performance.now()方法和Date.now()方法的差异

需要注意的是,虽然performance.now()方法旨在提供更高精度的时间,但是鉴于Spectre[1]漏洞的影响,现阶段的主流浏览器都加入了一些精度上的扰动,从而避免遭受相关的攻击。除此之外,一些浏览器出于隐私保护也提供了一些选项,用于避免提供过于精确的精度。

部分浏览器尚不支持performance.now()方法,在这种情况下可以使用当前时间戳(页面打开的时间戳)进行模拟。