我想知道一个特定函数使用了多少毫秒。所以我到处寻找,但是找不到一种精确到毫秒的Ruby时间。
您如何做到这一点?在大多数编程语言中,它只是类似于
start = now.milliseconds
myfunction()
end = now.milliseconds
time = end - start
发布于 2010-02-18 23:06:53
您可以使用ruby的Time
类。例如:
t1 = Time.now
# processing...
t2 = Time.now
delta = t2 - t1 # in seconds
现在,delta
是一个float
对象,您可以获得该类提供的尽可能细粒度的结果。
发布于 2012-09-05 01:08:45
您还可以使用内置的Benchmark.measure函数:
require "benchmark"
puts(Benchmark.measure { sleep 0.5 })
打印:
0.000000 0.000000 0.000000 ( 0.501134)
发布于 2017-08-03 19:41:46
使用Time.now
(返回挂钟时间)作为基线有几个问题,可能会导致意外的行为。这是由于挂钟时间受诸如插入的闰秒或将本地时间调整为参考时间的time slewing之类的变化的影响。
例如,如果在测量过程中插入了一个闰秒,它将偏离一秒。类似地,根据本地系统条件,您可能必须处理夏令时、运行更快或更慢的时钟,或者时钟甚至在时间上跳转,从而导致负持续时间和许多其他问题。
这个问题的一个解决方案是使用不同的时钟时间:单调时钟。这种类型的钟与挂钟有不同的特性。它以监控方式递增,即永远不会后退,并以恒定的速度增长。因此,它不代表墙上的时钟(即,你从墙上的时钟上读取的时间),而是一个时间戳,您可以将其与后来的时间戳进行比较,以获得差异。
在Ruby中,您可以将这样的时间戳与Process.clock_gettime(Process::CLOCK_MONOTONIC)
一起使用,如下所示:
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,您可以像这样调用此函数:
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
https://stackoverflow.com/questions/2289381
复制相似问题