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