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

问题描述 投票:0回答:3

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

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

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

但是我在我的电脑上测试了定时器: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

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

erlang
3个回答
12
投票

我一直认为“一些开销”的评论非常有趣。

erlang:now/0
实现提供有保证的唯一、单调递增值的技巧的方法是取出每个虚拟机的全局锁。在串行测试中,您不会注意到任何东西,但是当您运行大量并行代码时,您可能会注意到。

函数

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


6
投票

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

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

4
投票
除了 troutwine 的出色回答之外,

erlang:now()

在串行测试中更快的原因可能是它避免了内核,因为你调用它的速度可能比时间进度更快,然后你就处于不这样做的情况经常触及内核。

但请注意,在您添加多个核心之前,您的测试是具有欺骗性的。那么

os:timestamp()

 就像 troutwine 写的那样,将超越 
erlang:now()

另请注意,您使用的是一个较弱的平台,即 Windows。这通常会以非常重要的方式影响性能。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.