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()每次都会通过时间校正生成一个唯一的时间,保证每次都会生成一个唯一的值。
正是由于时间纠正机制的存在,所以服务器需要不时的修正时间,同一