前言
performance.now()
和 Date.now()
是 JavaScript 中用于获取当前时间的两个不同方法,但它们的用途和特性有所不同。下面是它们的详细区别与比较:
1. 概述
performance.now()
: 返回一个精确到微秒(千分之一毫秒)的时间戳,用于精确测量时间间隔。Date.now()
: 返回自1970年1月1日 00:00:00 UTC以来的毫秒数,用于获取当前的时间戳。
2. 精度
-
performance.now()
:- 精度非常高,可以精确到小数点后三位,通常用于测量代码执行的时间。
- 例如:
100.345
表示自页面加载以来的时间是 100.345 毫秒。
-
Date.now()
:- 精度相对较低,只精确到毫秒。
- 例如:
1692881050734
表示自1970年1月1日以来的毫秒数。
3. 基准点
-
performance.now()
:- 基准点是页面的导航开始时间,也就是页面加载时刻。它返回的是当前时间距离页面加载的时间差,因此它的值通常比较小,且不容易受到系统时钟调整的影响。
-
Date.now()
:- 基准点是1970年1月1日 00:00:00 UTC(Unix纪元)。它返回的是自该时刻以来的毫秒数,因此它的值是一个非常大的数字,并且可能受到系统时间变更的影响。
4. 性能测量
-
performance.now()
:- 专门为性能测量设计,不受系统时间调整的影响,非常适合用于代码执行时间的测量、动画帧率计算等精确度要求较高的场景。
-
Date.now()
:- 更适合用来获取当前的日期和时间信息,而不是进行精确的性能测量。由于可能会受到系统时间调整的影响,用来测量短时间间隔的准确性较差。
5. 示例对比
// 使用 performance.now() 测量函数执行时间
const startPerf = performance.now();
// 假设这是要测量的代码
for (let i = 0; i < 1000000; i++) {}
const endPerf = performance.now();
console.log(`Performance.now() 测量的时间: ${endPerf - startPerf} 毫秒`);
// 使用 Date.now() 测量函数执行时间
const startDate = Date.now();
// 假设这是要测量的代码
for (let i = 0; i < 1000000; i++) {}
const endDate = Date.now();
console.log(`Date.now() 测量的时间: ${endDate - startDate} 毫秒`);
6. 常见应用场景
-
performance.now()
:- 用于动画或游戏中帧率的计算。
- 测量某些函数或代码块的执行时间。
- 精确计算网络请求或文件下载的时间。
-
Date.now()
:- 获取当前的日期和时间。
- 生成基于时间的唯一标识符。
- 记录日志中的时间戳。
总结
- 精确度:
performance.now()
提供了比Date.now()
更高的精确度,是测量性能的首选。 - 基准点:
performance.now()
基于页面加载时间,不受系统时间调整的影响;而Date.now()
基于 Unix 时间戳,可能会受到系统时间调整的影响。 - 使用场景: 如果你需要测量时间间隔或执行性能分析,使用
performance.now()
是更好的选择;而Date.now()
则更适合用于与当前时间相关的任务。