如何在毫秒内在Ruby中执行操作?
我想知道一个特定函数使用了多less毫秒。 所以我看上去很高,但是却找不到一个精确到毫秒的Ruby时间。
你怎么做到这一点? 在大多数编程语言中,它只是类似的
start = now.milliseconds myfunction() end = now.milliseconds time = end - start
你可以使用ruby的Time
类。 例如:
t1 = Time.now # processing... t2 = Time.now delta = t2 - t1 # in seconds
现在, delta
是一个float
对象,你可以得到像class级提供的结果。
您也可以使用内置的Benchmark.Measure函数:
require "benchmark" puts(Benchmark.measure { sleep 0.5 })
打印:
0.000000 0.000000 0.000000 ( 0.501134)
你应该看看基准模块来执行基准testing。 但是,作为一个快速和肮脏的计时方法,你可以使用这样的东西:
def time now = Time.now.to_f yield endd = Time.now.to_f endd - now end
请注意, Time.now.to_f
的使用与Time.now.to_f
不同,不会截断为秒。
使用Time.now.to_f
absolute_time
gem是基准testing的替代品,但是使用原生指令更为准确。
使用Time.now
(它返回挂钟时间)作为基线有几个问题,可能会导致意外的行为。 这是由于挂钟时间受到像插入的闰秒或时间旋转等的变化以将当地时间调整到参考时间的事实所引起的。
如果在测量过程中插入了例如闰秒,它将被closures一秒钟。 同样,根据当地的系统条件,你可能不得不面对日光节约时间,更快或更慢的运行时钟,或者时钟甚至跳回来,导致负面的持续时间,以及许多其他问题。
解决这个问题的方法是使用不同的时钟时钟:单调时钟。 这种types的时钟具有与挂钟不同的属性。 它增加了monitonically,即永远不会回来,并以恒定的速度增加。 因此,它不代表挂钟(即从墙上的时钟读取的时间),而是可以与时间戳比较以获得差异的时间戳。
在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
方法返回一个时间戳作为一个小数秒的浮点数。 返回的实际数字没有定义的含义(您应该依赖)。 但是,您可以确定下一个电话将返回一个更大的数字,并通过比较这些值,您可以得到实时差异。
这些属性使得该方法成为衡量时间差异的主要候选者,而不会在最不恰当的时候看到程序失败(例如,在除夕又有一个闰秒插入的时候)。
如果你使用
date = Time.now.to_i
你在几秒钟内获得时间,这是远远不够准确,特别是如果你正在计时的小块代码。
Time.now.to_i
的使用返回从1970/01/01通过的第二个。 知道这一点,你可以做
date1 = Time.now.to_f date2 = Time.now.to_f diff = date2 - date1
有了这个,你将在第二级有所不同。 如果你想要它毫秒 ,只需添加到代码
diff = diff * 1000
我有一个gem可以剖析你的ruby方法(实例或类) – https://github.com/igorkasyanchuk/benchmark_methods 。
没有更多的代码是这样的:
t = Time.now user.calculate_report puts Time.now - t
现在你可以做:
benchmark :calculate_report # in class
而只是打电话给你的方法
user.calculate_report