首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Ruby中对操作进行毫秒计时?

如何在Ruby中对操作进行毫秒计时?
EN

Stack Overflow用户
提问于 2010-02-18 22:42:07
回答 9查看 63K关注 0票数 82

我想知道一个特定函数使用了多少毫秒。所以我到处寻找,但是找不到一种精确到毫秒的Ruby时间。

您如何做到这一点?在大多数编程语言中,它只是类似于

代码语言:javascript
复制
start = now.milliseconds
myfunction()
end = now.milliseconds
time = end - start
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-02-18 23:06:53

您可以使用ruby的Time类。例如:

代码语言:javascript
复制
t1 = Time.now
# processing...
t2 = Time.now
delta = t2 - t1 # in seconds

现在,delta是一个float对象,您可以获得该类提供的尽可能细粒度的结果。

票数 92
EN

Stack Overflow用户

发布于 2012-09-05 01:08:45

您还可以使用内置的Benchmark.measure函数:

代码语言:javascript
复制
require "benchmark"
puts(Benchmark.measure { sleep 0.5 })

打印:

代码语言:javascript
复制
0.000000   0.000000   0.000000 (  0.501134)
票数 63
EN

Stack Overflow用户

发布于 2017-08-03 19:41:46

使用Time.now (返回挂钟时间)作为基线有几个问题,可能会导致意外的行为。这是由于挂钟时间受诸如插入的闰秒或将本地时间调整为参考时间的time slewing之类的变化的影响。

例如,如果在测量过程中插入了一个闰秒,它将偏离一秒。类似地,根据本地系统条件,您可能必须处理夏令时、运行更快或更慢的时钟,或者时钟甚至在时间上跳转,从而导致负持续时间和许多其他问题。

这个问题的一个解决方案是使用不同的时钟时间:单调时钟。这种类型的钟与挂钟有不同的特性。它以监控方式递增,即永远不会后退,并以恒定的速度增长。因此,它不代表墙上的时钟(即,你从墙上的时钟上读取的时间),而是一个时间戳,您可以将其与后来的时间戳进行比较,以获得差异。

在Ruby中,您可以将这样的时间戳与Process.clock_gettime(Process::CLOCK_MONOTONIC)一起使用,如下所示:

代码语言:javascript
复制
t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
# => 63988.576809828

sleep 1.5 # do some work

t2 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
# => 63990.08359163

delta = t2 - t1
# => 1.5067818019961123
delta_in_milliseconds = delta * 1000
# => 1506.7818019961123

Process.clock_gettime方法以带小数秒的浮点数形式返回时间戳。实际返回的数字没有定义的含义(这是您应该依赖的)。但是,您可以确保下一次调用将返回一个更大的数字,并且通过比较这些值,您可以获得实时差异。

这些属性使该方法成为测量时间差的最佳候选方法,而不会看到您的程序在最不合适的时间失败(例如,在新年前夕午夜,当插入另一个闰秒时)。

这里使用的Process::CLOCK_MONOTONIC常量在所有现代的Linux、BSD和macOS系统以及Linux Subsystem for Windows上都可用。然而,它还不能用于“原始”的Windows系统。在那里,您可以使用GetTickCount64系统调用而不是Process.clock_gettime,后者也可以在Windows (>= Windows Vista、Windows Server2008)上以毫秒粒度返回一个计时器值。

使用Ruby,您可以像这样调用此函数:

代码语言:javascript
复制
require 'fiddle'

# Get a reference to the function once
GetTickCount64 = Fiddle::Function.new(
  Fiddle.dlopen('kernel32.dll')['GetTickCount64'],
  [],
  -Fiddle::TYPE_LONG_LONG # unsigned long long
)

timestamp = GetTickCount64.call / 1000.0
# => 63988.576809828
票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2289381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档