关于erlang的一点困惑:现在/ 0手册

goo*_*nsu 1 erlang

返回元组{MegaSecs,Secs,MicroSecs},它是自格林威治标准时间1970年1月1日00:00(零小时)起经过的时间,假设底层操作系统支持此操作.否则,选择其他一些时间点.还保证随后对此BIF的调用会不断返回增加的值.因此,now()的返回值可用于生成唯一的时间戳,如果在快速机器上的紧密循环中调用它,则节点的时间可能会变得偏斜.

粗体句意味着什么?我有点困惑,因为我的英语不是很好:)是否意味着时间线以45度上升或者是否意味着如果erlang:now/0经常调用节点的性能会降低?

非常感谢你.

Ada*_*erg 5

erlang:now/0构建,以便它总是返回一个递增的数字(也就是说,MicroSecs总是保证会被1加点).这很有用,因为它允许您now()在系统中使用返回值作为唯一ID(至少在VM的一个会话期间).

但是,这也意味着如果你运行足够快的循环(即,每个循环有时快于1微秒),你可能会"请求"超过可用的微秒.所以你实际上会增加它当前值的时间!(当然,这是一件非常糟糕的事情)

  • 微秒是一段相当短的时间.我能够通过创建元组`{now(),now(),now(),now(),now()}来获得你所询问的行为(微秒部分增加1),这通常会增加数字.但是,如果我在那里抛出一个简单的计算:`{now(),now(),5 + 1,now(),now(),now()}`,我们看到计算将需要一些微秒.我很难想象什么时候这会成为单一机器上的问题,至少如果你在循环中做了任何有意义的事情. (3认同)