1

如手册中所述,http://www.erlang.org/erldoc?q=erlang:now

如果您不需要返回值唯一且单调递增,请改用 os:timestamp/0 以避免一些开销。

os:timestamp/0 应该比 erlang:now/0 快

但是我在我的 PC 上使用 timer:tc/3 进行了测试,对于 10000000 次调用,以微秒为单位花费的时间是:

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

为什么 erlang:now/0 比 os:timestamp/0 快?

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

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

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

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

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

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

4

3 回答 3

12

我一直认为“一些开销”的评论很有趣。实现提供保证唯一、单调递增值的技巧的方法erlang:now/0是取出每个 VM 的全局锁。在串行测试中,您不会注意到任何东西,但是当您运行大量并行代码时,您可能会注意到。

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

于 2013-07-01T07:46:19.693 回答
6

最近在 erlang-questions 邮件列表(2013 年 4 月 3 日的“erlang:now() vs os:timestamp()”)上对此进行了讨论,其中出现了两个有趣的结果:

  • erlang:now似乎比os:timestamp解释代码更快(与编译代码相反,后者os:timestamp更快)。
  • 如果您对它们进行基准测试,您应该使用os:timestamp而不是测量所花费的时间erlang:now,因为erlang:now会强制时钟前进。
于 2013-07-01T08:58:05.487 回答
4

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

但请注意,在您添加多个内核之前,您的测试具有欺骗性。然后os:timestamp()就像 troutwine 写的那样,会跑赢大盘erlang:now()

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

于 2013-07-01T08:45:51.420 回答