簡體   English   中英

toFixed() 對 performance.now() 的行為

[英]toFixed() behavior on performance.now()

performance.now上使用toFixed時,它會顯示一些我認為通常是四舍五入的數字。 但看起來,范圍因平台而異。

在 chrome(v87.0.4280.66) 上,最多可以得到 35 位數字

window.performance.now().toFixed(35); // "241989.00499999945168383419513702392578125"

在 node.js(v15.2.1) 上,最多只有 28 個。

performance.now().toFixed(28) // "1092.9840000011026859283447265625"

performance.timeOrigin也存在相同的行為。 我認為可以使用performance.now()進行更准確的測量,但准確度取決於硬件和軟件因素,因此他們只是將准確度保持在最低標准。

  1. performance.now()上使用toFixed(100) performance.now()會使其更准確嗎?
  2. 哪些因素會影響performance.now()范圍?
  3. 我們可以安全地說(performance.timeOrigin + performance.now()).toFixed(12)讓我們測量精確到幾乎飛秒 (10⁻¹⁵) 或至少比Date.now()准確得多的Date.now() ?

我認為說toFixed()使它更准確是錯誤的。

基本上toFixed()只格式化輸入數字。

至於performant.now()它返回毫秒值,表示自時間原點以來經過的時間。

時間原點是一個標准時間,被認為是當前文檔生命周期的開始。

因此,根據您的問題,您可以想象該值在不同平台上的計算方式不同。

來自mozilla.org

  • 如果當前文檔是窗口中加載的第一個文檔,則時間原點是創建瀏覽器上下文的時間。

  • 如果在卸載窗口中加載的上一個文檔的過程中,出現了一個確認對話框讓用戶確認是否離開上一個頁面,則時間原點是用戶確認導航到該頁面的時間。新頁面是可以接受的。

  • 如果以上都沒有確定時間原點,則時間原點是負責創建窗口當前文檔的導航發生的時間。

Node 的performance.now字面意思是:

function now() {
  const hr = process.hrtime();
  return hr[0] * 1000 + hr[1] / 1e6;
}

它的精度是納秒級 (所以不是在那個 API 中沒有意義的點之后的 26 位數字)。 這只是調用uv_hrtime (參見 node_process_methods.cc),它執行clock_gettime這只是獲取納秒時間標准方法

在瀏覽器中情況更糟 - 因為進行指紋識別或緩存值提取performance.now的定時攻擊。現在不太准確:

為了防止計時攻擊和指紋識別,performance.now() 的精度可能會根據瀏覽器設置四舍五入。

所以你真的可以依賴毫秒值。

返回的內容被限制在 chrome 中 有關更多信息,請參閱time_clamper.cc 基本上它的percision僅限於:

static constexpr double kResolutionSeconds = 5e-6;

故意地。

正如另一個答案指出的那樣.toFixed只是將數字格式化為字符串,與任何這些都無關。


注:這樣的事實的API是精確的X以任何方式表明第十屆后的數字是零。 這僅意味着您只能依賴該數字的准確性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM