erlang:now/0比os:timestamp/0快?

erlang:now/0比os:timestamp/0快?,erlang,Erlang,正如手册中所说 如果不需要返回值唯一且单调递增,请使用os:timestamp/0来避免一些开销 os:timestamp/0应该比erlang:now/0快 但我在我的PC上测试了定时器:tc/3,对于10000000次呼叫,以微秒为单位的时间是: 二郎:现在是951000 操作系统:时间戳1365000 为什么erlang:now/0比os:timestamp/0快 我的操作系统:Windows 7 x64,erlang版本:R16B01 ------------------编辑------

正如手册中所说

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

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

但我在我的PC上测试了定时器:tc/3,对于10000000次呼叫,以微秒为单位的时间是:

二郎:现在是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

因此,我认为“间接费用”是指平行费用。

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


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

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


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

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

但请注意,在添加多个内核之前,您的测试是骗人的。然后,
os:timestamp()


还要注意的是,您所处的平台很弱,即Windows。这通常会以非平凡的方式影响性能。

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

但请注意,在添加多个内核之前,您的测试是骗人的。然后,
os:timestamp()

还要注意的是,您所处的平台很弱,即Windows。这通常会以非平凡的方式影响性能。

这是2013年4月3日的“erlang:now()vs os:timestamp()”,其中出现了两个有趣的结果:

  • erlang:now
    似乎比解释代码中的
    os:timestamp
    更快(与编译代码相反,
    os:timestamp
    更快)
  • 如果您对它们进行基准测试,您应该使用
    os:timestamp
    而不是
    erlang:now
    来测量所花费的时间,因为
    erlang:now
    强制时钟前进
这是2013年4月3日的“erlang:now()vs os:timestamp()”,其中出现了两个有趣的结果:

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