二郎:现在/ 0比操作系统更快:时间戳/ 0?(erlang:now/0 is faster tha

2019-10-18 07:24发布

正如在说明书上说, http://www.erlang.org/erldoc?q=erlang:now

如果你不需要返回值是唯一的,单调递增的,使用的操作系统:时间戳/ 0来避免一些开销。

操作系统:时间戳/ 0应该比二郎神更快:现在/ 0

但是,我在我的电脑用计时器上测试:TC / 3,为千万通话,在微秒所花费的时间是:

二郎:现在951000
操作系统:时间戳1365000

为什么二郎:现在比OS / 0更快:时间戳/ 0?

我的操作系统:Windows 7 64位系统,二郎版本:R16B01。

- - - - - - - - - 编辑 - - - - - - - - -

我在平行(100螺纹)写了另一个测试代码,OS:时间戳/ 0进行并联更好。 这里是数据:

----- single thread ------
erlang:now 95000
os:timestamp 147000

----- multi thread ------
erlang:now 333000
os:timestamp 91000

所以,我认为“开销”是平行的。

Answer 1:

我一直认为,“一些开销”的评论是黑暗有趣。 方式erlang:now/0达到其提供保证的独特的,单调递增的价值关键是要拿出每VM全局锁。 在串行测试你不会注意到任何东西,但是当你有很多并行代码运行,你可能。

功能os:timestamp/0不取出的锁,并且可以在两个过程返回相同的值。



Answer 2:

这是最近在邮件列表中二郎-问题讨论 (“:现在()与OS:二郎时间戳()” 4月3日2013年),其中两个有趣的结果出现了:

  • erlang:now似乎快于os:timestamp在解释代码(而不是编译代码,其中os:timestamp是更快)。
  • 如果作为比较基准,你应该测量使用所花费的时间os:timestamp ,而不是erlang:now ,因为erlang:now强制时钟推进。


Answer 3:

除了由troutwine的出色答卷,之所以erlang:now()是一个串行测试更快的可能是,它避免了内核,因为你可能会调用它比时间更快的进展,然后你在哪里,你穿上情况”牛逼命中内核频繁。

但要注意,你的测试是欺骗,直到你加比单核多。 然后os:timestamp()一样troutwine写道,将超越erlang:now()

另外请注意你是一个薄弱的平台,即Windows操作系统。 这通常会影响非平凡的方式表现。



文章来源: erlang:now/0 is faster than os:timestamp/0?
标签: erlang