Performance: now() 方法
注意:此功能在 Web Workers 中可用。
performance.now() 方法返回一個高精度毫秒級時間戳。它表示自 Performance.timeOrigin(在視窗上下文中導航開始的時間,或在 Worker 和 ServiceWorker 上下文中 worker 啟動的時間)以來經過的時間。
語法
now()
引數
無。
返回值
返回一個以毫秒為單位測量的 DOMHighResTimeStamp。
描述
Performance.now 與 Date.now 對比
與 Date.now 不同,performance.now() 返回的時間戳不限於一毫秒的解析度。相反,它們以浮點數表示時間,精度高達微秒。
此外,Date.now() 可能受到系統和使用者時鐘調整、時鐘偏差等因素的影響,因為它相對於 Unix 紀元(1970-01-01T00:00:00Z)且依賴於系統時鐘。而 performance.now() 方法則相對於 timeOrigin 屬性,這是一個 單調時鐘:其當前時間永遠不會減少,也不會受到調整的影響。
performance.now 規範變更
performance.now() 方法的語義在 High Resolution Time Level 1 和 Level 2 之間發生了變化。
| 變更 | Level 1 | Level 2 |
|---|---|---|
| 相對於 | performance.timing.navigationStart |
Performance.timeOrigin |
| 觸發條件 | 文件獲取或解除安裝提示(如果有)。 | 瀏覽上下文的建立(如果沒有先前文件)、解除安裝提示(如果有),或導航的開始(根據 HTML 定義,發生在獲取之前幾個步驟)。 |
performance.now() 方法曾經相對於導航時間規範中的 performance.timing.navigationStart 屬性。現在這一行為已改變,performance.now() 現在相對於 Performance.timeOrigin,這可以避免跨網頁比較時間戳時的時鐘更改風險。
// Level 1 (clock change risks)
currentTime = performance.timing.navigationStart + performance.now();
// Level 2 (no clock change risks)
currentTime = performance.timeOrigin + performance.now();
睡眠期間的計時
規範(Level 2)要求 performance.now() 在作業系統睡眠或瀏覽器程序以任何方式凍結時應繼續計時。似乎只有 Windows 上的瀏覽器在睡眠期間會繼續計時。其他作業系統的相關瀏覽器 bug
根據您的用例,這種差異可能很重要,也可能不重要。例如,如果您正在計時短時間操作(如載入影像),在此期間系統不太可能睡眠,這可能不會引起任何問題。如果您正在計時長時間操作,您可能會發現 Date.now() 更能避免這些限制,因為 performance.now() 的高精度在這種情況下可能並非至關重要。
您還可以在規範問題 hr-time#115 中找到更多詳細資訊。
安全要求
為了防止定時攻擊和 指紋識別,performance.now() 會根據文件是否 跨域隔離 來進行粗化處理。
- 隔離上下文中的解析度:5 微秒
- 非隔離上下文中的解析度:100 微秒
您可以使用 Window.crossOriginIsolated 和 WorkerGlobalScope.crossOriginIsolated 屬性來檢查文件是否跨域隔離。
if (crossOriginIsolated) {
// Use measureUserAgentSpecificMemory
}
示例
使用 performance.now()
要確定程式碼中的特定點以來經過了多少時間,您可以這樣做:
const t0 = performance.now();
doSomething();
const t1 = performance.now();
console.log(`Call to doSomething took ${t1 - t0} milliseconds.`);
規範
| 規範 |
|---|
| 高精度時間 # dom-performance-now |
瀏覽器相容性
載入中…