erlang:now() vs os:timestamp(),到底该选谁?

Erlang提供了两个时间函数来获取时间,这两个函数有多大区别呢?
摘要由CSDN通过智能技术生成

Erlang提供了两个时间函数来获取时间:
 
 1. erlang:now()
 2. os:timestamp()

两个函数用法相同,都返回从1970年1月1日0:00到现在经过的时间,结果为{MegaSecs, Secs, MicroSecs}。时间函数的调用可能非常频繁,而且很多优化建议中都说尽量不要使用erlang:now(),那这两者究竟有多大差别呢?

首先要注意一个问题,erlang本身是有一套时间校正机制,什么是时间校正呢?

当操作系统的时间发生突变时,erlang并不会立即把内部时间变为系统时间,从而避免时间的倒退和不平滑的问题。Erlang通过将时间轻微加快或减慢,在将来的某个时间将内部时间和系统时间拉到一致。

那时间校正时怎么影响上述两个函数呢?

os:timestamp()

os:timestamp()获取的是操作系统的墙上时间os system time,并调整为erlang system time,不受时间校正影响。
本质上是调用time.h的posix_clock_gettime(),参数是WALL_CLOCK_ID获取墙上时间,将结果转为erlang system time。Linux已经把这类函数vdso化,获取时间开销本质上等同于读取一个字长的内存的代价而已。

erlang:now()

erlang:now()每次都会通过时间校正生成一个唯一的时间,保证每次都会生成一个唯一的值。
正是由于时间纠正机制的存在,所以服务器需要不时的修正时间,同一

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值