簡體   English   中英

使用 JS Date 對象以毫秒為單位獲取當前時間的最快和最輕量級的方法

[英]Fastest and lightest way to get the current time in milliseconds with JS Date object

有多種方法可以使用Date對象獲取當前時間(以毫秒為單位):

(new Date()).getTime();
+new Date();
Date.now();

假設您不需要創建對象而只需要以毫秒為單位的當前時間,那么哪個是最有效的? 在性能方面。

編輯:我知道大多數開發人員不會關心這一點,但是當您在低技術嵌入式環境中工作或只是為了消除好奇心時,這可能很重要。

Date.now()獲勝。 jsperf.com 測試

但正如上面評論中所指出的,與您將要做的任何其他事情相比,CPU 成本可能並不有趣。

@techfoobar 提到了分配 Date 對象的成本(或者,實際上,垃圾收集這些 Date 對象的成本)。 這可能是一個重大的勝利,也可能不是一個重大的勝利,因為 Date.now() 可能正在分配 Number 對象,這將是同樣昂貴的。

此外,如果時間戳是針對數據時間戳以外的任何內容(例如代碼執行的時間)獲取的,那么最好考慮是否可以通過 setTimeout 或 setInterval 調用來實現相同的目的,而無需直接訪問時間戳價值。

由於這里沒有討論performance.now(),並且由於jsperf.com現在似乎下降了,所以我做了一些簡單的測試,表明fastness的排名是:

  1. Date.now() -- 1000 萬次迭代大約需要 1 秒
  2. new Date() -- 1000 萬次迭代大約需要 2 秒
  3. performance.now() -- 1000 萬次迭代大約需要 4 秒

可悲的是,performance.now() 比 Date.now() 慢了 4 倍。 那是在 Chrome 上。

這是我的代碼,升級到 1 億次迭代,並且 performance.new() 測試變得更糟。 不要擔心我使用 performance.now() 作為所有 3 個選項的測量計時器,重要的是循環中的內容。 我在上次測試中進行了 1 億次迭代,因為我想看看 new Date() 和 Date.now() 上的垃圾收集是否會啟動並懲罰我們。 但是不,更糟糕的不是它們,而是 performance.now() 方法。

function perftest(iterations, fn) {
    const start = performance.now();
    for(let i = 0; i < iterations; i++)
        fn();
    return performance.now() - start;
}

> perftest(100000000, () => Date.now())
< 11285.5
> perftest(100000000, () => new Date())
< 22834.59999999404
> perftest(100000000, () => performance.now())
< 48602.40000000596

順便說一句,通過 fn() 函數調用的間接調用真的很小。 與直接在循環中調用測試語句相比,它總共增加了大約 200 毫秒。

暫無
暫無

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

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