2013-07-01 35 views
1

正如在说明书上说,http://www.erlang.org/erldoc?q=erlang:nowerlang:now/0比os:timestamp/0更快?

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

OS:时间戳/ 0应该比二郎神更快:现在/ 0

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

二郎:现在951000
OS:时间戳1365000

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

我的操作系统:Windows 7 x64,erlang版本:R16B01。

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

我又写测试代码parallel(100个线程),os:timestamp/0并行执行得更好。这里是数据:

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

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

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

回答

12

我一直认为'一些开销'的评论是非常有趣的。 erlang:now/0的方式实现了提供保证唯一,单调增加值的技巧,即取出每个VM的全局锁。在一个串行测试中,你不会注意到任何东西,但是当你有很多并行代码在运行时,你可能会这样做。

函数os:timestamp/0不取出锁,可能在两个进程中返回相同的值。

4

除了troutwine的优秀回答之外,erlang:now()在串行测试中速度更快的原因可能是它避免了内核,因为您可能比时间进度更快地调用内核,然后您处于一种情况,经常碰到内核。

但是请注意,您的测试是欺骗性的,直到您添加多个核心。然后os:timestamp()像troutwine写道,将超过erlang:now()

另请注意,您处于弱平台上,即Windows。这通常会以非平凡的方式影响性能。

6

这是recently discussed on the erlang-questions mailing list( “二郎:现在()与OS:时间戳()” 4月3日2013年),其中两个有趣的结果出现了:

  • erlang:now似乎比os:timestamp更快解释代码(而不是编译的代码,其中os:timestamp更快)。
  • 如果您对它们进行基准测试,则应使用os:timestamp而不是erlang:now来测量所用的时间,因为erlang:now会强制时钟前进。