设为首页 收藏本站
查看: 775|回复: 0

[经验分享] nodejs中获取时间戳、时间差

[复制链接]

尚未签到

发表于 2017-2-24 09:03:00 | 显示全部楼层 |阅读模式
  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】
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346404-1-1.html 上篇帖子: nodejs的express使用介绍 下篇帖子: NodeJs使用asyncAwait两法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表