正如在说明书上说, 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
所以,我认为“开销”是平行的。
我一直认为,“一些开销”的评论是黑暗有趣。 方式erlang:now/0
达到其提供保证的独特的,单调递增的价值关键是要拿出每VM全局锁。 在串行测试你不会注意到任何东西,但是当你有很多并行代码运行,你可能。
功能os:timestamp/0
不取出的锁,并且可以在两个过程返回相同的值。
这是最近在邮件列表中二郎-问题讨论 (“:现在()与OS:二郎时间戳()” 4月3日2013年),其中两个有趣的结果出现了:
-
erlang:now
似乎快于os:timestamp
在解释代码(而不是编译代码,其中os:timestamp
是更快)。 - 如果作为比较基准,你应该测量使用所花费的时间
os:timestamp
,而不是erlang:now
,因为erlang:now
强制时钟推进。
除了由troutwine的出色答卷,之所以erlang:now()
是一个串行测试更快的可能是,它避免了内核,因为你可能会调用它比时间更快的进展,然后你在哪里,你穿上情况”牛逼命中内核频繁。
但要注意,你的测试是欺骗,直到你加比单核多。 然后os:timestamp()
一样troutwine写道,将超越erlang:now()
另外请注意你是一个薄弱的平台,即Windows操作系统。 这通常会影响非平凡的方式表现。