Performance: timeOrigin 屬性

Baseline 已廣泛支援

此功能已成熟,並可在多種裝置和瀏覽器版本上執行。自 2021 年 9 月起,所有瀏覽器均已支援此功能。

注意:此功能在 Web Workers 中可用。

Performance 介面的只讀屬性 timeOrigin 返回一個高解析度時間戳,用作與效能相關的各個時間戳的基準。

在 Window 上下文中,此值代表導航開始的時間。在 WorkerServiceWorker 上下文中,此值代表 worker 執行的時間。您可以使用此屬性來同步不同上下文之間的時間基準(請參閱下面的示例)。

注意: performance.timeOrigin 的值可能與在 time origin 時執行的 Date.now() 返回的值不同,因為 Date.now() 可能會受到系統和使用者時鐘調整、時鐘偏差等因素的影響。timeOrigin 屬性是一個 單調時鐘,其當前時間永不減小,並且不受這些調整的影響。

一個高解析度時間戳,被認為是當前文件生命週期的開始。它的計算方式如下:

  • 如果指令碼的 全域性物件 是一個 Window,則 time origin 的確定方式如下:

    • 如果當前 Document 是在 Window 中載入的第一個文件,則 time origin 是瀏覽器上下文建立時的時間。
    • 如果在解除安裝之前在視窗中載入的文件的過程中,顯示了確認對話方塊,以允許使用者確認是否離開上一頁,則 time origin 是使用者確認導航到新頁面可接受時的時間。
    • 如果以上任一情況均未確定 time origin,則 time origin 是導致視窗當前 Document 出現的導航發生時的時間。
  • 如果指令碼的全域性物件是 WorkerGlobalScope(即指令碼作為 web worker 執行),則 time origin 是 worker 被建立時的時刻。

  • 在所有其他情況下,time origin 為 undefined。

示例

同步上下文之間的時間

為了解決視窗和 worker 上下文中不同的 time origin 問題,您可以透過 timeOrigin 屬性來轉換來自 worker 指令碼的時間戳,從而使整個應用程式的計時保持同步。

在 worker.js 中

js
self.addEventListener("connect", (event) => {
  const port = event.ports[0];

  port.onmessage = (event) => {
    const workerTaskStart = performance.now();
    // doSomeWork()
    const workerTaskEnd = performance.now();
  };

  // Convert worker-relative timestamps to absolute timestamps, then send to the window
  port.postMessage({
    startTime: workerTaskStart + performance.timeOrigin,
    endTime: workerTaskEnd + performance.timeOrigin,
  });
});

在 main.js 中

js
const worker = new SharedWorker("worker.js");
worker.port.addEventListener("message", (event) => {
  // Convert absolute timestamps into window-relative timestamps
  const workerTaskStart = event.data.startTime - performance.timeOrigin;
  const workerTaskEnd = event.data.endTime - performance.timeOrigin;

  console.log("Worker task start: ", workerTaskStart);
  console.log("Worker task end: ", workerTaskEnd);
});

規範

規範
高精度時間
# dom-performance-timeorigin

瀏覽器相容性