Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby方法的度量和基准时间_Ruby On Rails_Ruby_Time_Benchmarking_Interpreter - Fatal编程技术网

Ruby on rails Ruby方法的度量和基准时间

Ruby on rails Ruby方法的度量和基准时间,ruby-on-rails,ruby,time,benchmarking,interpreter,Ruby On Rails,Ruby,Time,Benchmarking,Interpreter,我如何在Ruby中度量一个方法和该方法中的各个语句所花费的时间。如果您看到下面的方法,我想测量该方法所花费的总时间以及数据库访问和redis访问所花费的时间。我不想在每条语句之前编写Benchmark.measure。ruby解释器是否为我们提供了执行此操作的挂钩 def foo # code to access database # code to access redis. end 你可以使用时间对象 比如说, start = Time.now # code to time finish

我如何在Ruby中度量一个方法和该方法中的各个语句所花费的时间。如果您看到下面的方法,我想测量该方法所花费的总时间以及数据库访问和redis访问所花费的时间。我不想在每条语句之前编写Benchmark.measure。ruby解释器是否为我们提供了执行此操作的挂钩

def foo
# code to access database
# code to access redis. 
end
你可以使用时间对象

比如说,

start = Time.now
# code to time
finish = Time.now

diff = finish - start
diff将以秒为单位,作为一个浮点数

编辑:结束是保留的。

本着的精神,但稍微简单一点,您也可以按如下方式进行操作:

start = Time.now
# code to time
Time.now - start
最简单的方法是:

require 'benchmark'

def foo
 time = Benchmark.measure {
  code to test
 }
 puts time.real #or save it to logs
end
样本输出:

2.2.3 :001 > foo
  5.230000   0.020000   5.250000 (  5.274806)
值为:cpu时间、系统时间、总运行时间和实际运行时间

来源:。

使用基准的报告 这将输出如下内容:

                        user     system      total        real
Access Database:    0.020000   0.000000   0.020000 (  0.475375)
Access Redis:       0.000000   0.000000   0.000000 (  0.000037)

<------ 20 -------> # This is where the 20 comes in. NOTE: This is not shown in output.

可以找到更多信息。

再想一想,使用Ruby代码块参数定义度量函数有助于简化时间度量代码:

def measure(&block)
  start = Time.now
  block.call
  Time.now - start
end

# t1 and t2 is the executing time for the code blocks.
t1 = measure { sleep(1) }

t2 = measure do
  sleep(2)
end

许多答案都暗示了时间的使用。但值得注意的是,时间可以改变。系统时钟可能会漂移,可能会由系统管理员或通过NTP进行纠正。因此,Time.now有可能向前或向后跳跃,给出不准确的基准测试结果

更好的解决方案是使用操作系统的单调时钟,它总是向前移动。Ruby 2.1及更高版本通过以下方式访问:

start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
# code to time
finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
diff = finish - start # gets time is seconds as a float

你可以阅读更多细节。您还可以看到流行的Ruby项目Sidekiq切换到了。

Ruby有一些类似于javascript的新版本,但我记不起正确的语法。应该给你一个不错的谷歌列表though@Phani你能选择一个正确的答案吗?8年后,我认为这里有一些可靠的答案。谢谢。只是一个小小的更正。end是保留的,因此请使用其他变量名。Time.now受系统时钟调整的影响,因此最好使用Process.clock\u gettimeProcess::clock\u单调。但对于粗略的计算来说,这并不重要。你也可以做Benchmark.realtime{block}如果你只是想要实时的话,我刚刚回到我自己的答案,对Benchmark如何处理这个问题再次留下了深刻的印象。喜欢Ruby。这应该是首选答案:因为在Ruby2.2中,基准类使用单调时钟,正如其他答案中所讨论的。例如,请参阅以下源代码,并在第286行查找def度量值:在您的定义中,您将其称为基准测试。当你使用它时,它被称为测量。请解决这个问题。这个答案与回答这个问题的方式略有不同。仅仅因为你能从@wquist的答案中找出它并不意味着它是无效的。
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
# code to time
finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
diff = finish - start # gets time is seconds as a float