nodejs中獲取時間戳、時間差


Nodejs中獲取時間戳的方法有很多種,例如:
new Date().getTime()
Date.now()
process.uptime()
process.hrtime()
平時想獲取一個時間戳的話,用這些方法都可以,那么這些方法有什么區別呢?

new Date().getTime()和Date.now()

這些方法是通過node運行環境的系統時間毫秒數,+new Date()寫法的效果和new Date().getTime()效果相同。
在需要頻繁使用時間戳的場景中,需要關注方法性能,這幾種方法中Date.now()的性能最佳,可以通過一點代碼來測試:

var t1 = new Date().getTime();
var t2 = t1;
var i = 0, count = 10000000, interval = 0;

for(i = 0; i < count; i++)
{
    t2 = new Date().getTime();
    interval = (t2 - t1);
}
interval = (t2 - t1);
console.log('【new Date().getTime()】interval: ', interval);

t1 = new Date().getTime();
for(i = 0; i < count; i++)
{
    t2 = +new Date;
    interval = (t2 - t1);
}
interval = (t2 - t1);
console.log('【+new Date】interval: ', interval);

t1 = new Date().getTime();
for(i = 0; i < count; i++)
{
    t2 = Date.now();
    interval = (t2 - t1);
}
interval = (t2 - t1);
console.log('【Date.now()】interval: ', interval);

輸出結果:
【new Date().getTime()】interval: 1583
【+new Date】interval: 2189
【Date.now()】interval: 891

如果只是獲取時間戳,那么使用Date.now()是最佳的做法,但是如果要計算時間差,這幾個方法就會有點問題:運行環境的系統時間有時候是會有微小回調的,這樣得到的時間差就不精確了,有時候會引發某些BUG。

process.hrtime()

這種方式是根據任意取的一個過去的時間點,距離現在的時間來獲取一個精確的時間戳對象:[秒, 納秒]

> process.hrtime()
[ 3197146, 563552237 ]

這種方式和系統時間無關,因此不會受到系統時鍾漂移的影響,用來計算時間差的時候就不會有BUG了。
但是,萬事總有但是 - -
如果用在一個被頻繁調用的地方呢?

var t1 = new Date().getTime();
var t2 = t1;
var i = 0, count = 10000000, interval = 0;

var hrTime1 = process.hrtime();
var hrTime2 = hrTime1;

t1 = new Date().getTime();
for(i = 0; i < count; i++)
{
    hrTime2 = process.hrtime(hrTime1);
}
t2 = new Date().getTime();
interval = parseInt(hrTime2[0] * 1e3 + hrTime2[1] * 1e-6);
console.log('【hrTime】interval: ', interval, t2 - t1);

【hrTime】interval: 6412 6413
沒有記錯的話,相同的創建次數,上面的Date.now()可是900ms左右啊!
process.hrtime()也太慢了有木有!!!
原來nodejs處理高精度時間的時候,計算比較復雜,占用系統資源多,速度慢,那么在高頻應用的地方就不適合用這個方法了。下面請看process.uptime()

process.uptime()

此函數是通過nodejs啟動運行時間來得到一個秒數時間戳,精確到毫秒:
process.uptime
輸入:6.419
此函數以node啟動時間為准,同樣也不會受系統時鍾漂移影響,適合用來計算時間差。
那么多次調用性能如何呢?

var t1 = new Date().getTime();
var t2 = t1;
var i = 0, count = 10000000, interval = 0;

t1 = process.uptime()*1000;
for(i = 0; i < count; i++)
{
    t2 = process.uptime()*1000;
    //interval = (t2 - t1);
}
interval = (t2 - t1);
console.log('【process.uptime()】interval: ', interval);

輸出:【process.uptime()】interval: 954

和process.hrtime()相比性能就搞出很多了~
不用算那么精確,就是快!
那么需要高頻計算時間差的場合,就是你了!

測試代碼地址:https://github.com/zouchengzhuo/nodejsLearn/tree/master/getTime

本文轉自我的個人站點:http://zoucz.com/blog/2016/06/28/nodejs-get-time/

【end】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM