如手册中所述,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:now/0
实现提供有保证的唯一、单调递增值的技巧的方法是取出每个虚拟机的全局锁。在串行测试中,您不会注意到任何东西,但是当您运行大量并行代码时,您可能会注意到。
函数
os:timestamp/0
不会取出锁,并且可能在两个进程中返回相同的值。
最近在 erlang-questions 邮件列表上讨论了这个问题(2013 年 4 月 3 日的“erlang:now() vs os:timestamp()”),其中出现了两个有趣的结果:
在解释代码中,erlang:now
似乎比
os:timestamp
更快(与编译代码相反,其中
os:timestamp
更快)。
os:timestamp
而不是
erlang:now
来测量所用的时间,因为
erlang:now
会强制时钟前进。
erlang:now()
在串行测试中更快的原因可能是它避免了内核,因为你调用它的速度可能比时间进度更快,然后你就处于不这样做的情况经常触及内核。但请注意,在您添加多个核心之前,您的测试是具有欺骗性的。那么
os:timestamp()
就像 troutwine 写的那样,将超越
erlang:now()
。另请注意,您使用的是一个较弱的平台,即 Windows。这通常会以非常重要的方式影响性能。