【问题标题】:Little confusion on erlang:now/0 manualerlang:now/0 手册上的小困惑
【发布时间】:2012-10-10 15:51:00
【问题描述】:

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

粗体字是什么意思?我有点困惑,因为我的英语不是很好:) 是时间线上升45度,还是说调用erlang:now/0太频繁会导致节点性能下降?

非常感谢。

【问题讨论】:

    标签: erlang


    【解决方案1】:

    erlang:now/0 的构建使其始终返回一个递增的数字(即,MicroSecs 将始终保证被加 1)。这很有用,因为它让您可以使用 now() 返回的值作为系统中的唯一 ID(至少在 VM 的一个会话期间)。

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

    【讨论】:

    • “(当然,这是一件非常糟糕的事情)” - 不一定。另请注意,通过运行紧密循环很难进入这个位置。更合理的情况是,如果您在多核机器上有多个进程。
    • @EmilVikström 你能提供更多细节吗?比如这种情况不会发生在单核机上吗?
    • 一微秒是一段相当短的时间。我可以通过创建元组{now(), now(), now(), now(), now()} 来获得您所询问的行为(微秒部分增加一),该元组通常会给出越来越多的数字。但是,如果我在那里进行一个简单的计算:{now(), now(), 5+1, now(), now(), now()},我们会看到计算需要几微秒。我很难想象这在单核机器上何时会成为问题,至少如果你在循环中做任何有意义的事情的话。
    • @EmilVikström 扭曲系统时间总是一件“坏事”,许多库甚至系统的某些部分都依赖它。运行一个紧密的循环只是如何到达那里的一个例子。
    • Adam,然后按照now/0 手册页的建议使用os:timestamp/0
    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 2013-10-24
    • 1970-01-01
    相关资源
    最近更新 更多