在循环外重置计时器

时间:2018-10-29 12:31:49

标签: ruby-on-rails ruby loops time

我已经为要计时的功能设置了计时器,但希望在满足条件后将其重置

timestart = Time.now

Individual.all.each do |f|

    endtime = Time.now
    timer = (endtime - timestart)

    puts timer #places the time it takes for each loop

    if checktime  == 1 then
        ###Apply new {timestart = Time.now} HERE?###
    end

end

所以在上面的示例中,我希望我的计时器在1分钟后重置

5 个答案:

答案 0 :(得分:2)

这是您使用yield清理主要方法的方式

@timestart = Time.now

def one_min_check 
  start_time = Time.now
  yield
  end_time = Time.now
  puts "Something took #{end_time - start_time} to run"
  if end_time - @timestart >= 60.0
    @timestart = end_time 
    puts "Took 1 minute or longer. Reset 1 min at #{@timestart}"
  end
end


Individual.all.each do |f|
   one_min_check do 
     #do stuff with f
   end
end

但是,为什么不只是用户基准测试呢?

require 'benchmark'

Individual.all.each do |f|
  puts Benchmark.measure do 
    #do stuff with f
  end
end

答案 1 :(得分:2)

您的问题的答案可能是:一分钟后以类似于Rails的简单方式重置:

timestart = Time.now

Individual.all.each do |f|

    endtime = Time.now
    timer = (endtime - timestart)

    puts timer #places the time it takes for each loop

    if timestart < 1.minute.ago
        timestart = Time.now
    end

end

但是,如果我们了解您为什么要以此基准对循环进行基准测试,则可能会更有帮助。为什么要每分钟重置一次计时器?

您也有此评论:places the time it takes for each loop。这在您的代码中并不完全正确,因为您没有在每个循环中重置timestart。假设循环需要1秒。第一次迭代timer将是“ 1秒”。即使循环迭代只花了一秒钟,第二次timer也将是“ 2秒”。

但是您可能有自己的理由:)

答案 2 :(得分:0)

您可以计算出来。

quantity = Individual.all.count
time = Benchmark.measure { Post.all }

time_per_each = time / quantity.to_f

您得到的答案以毫秒为单位,只需转换即可。

希望对您有帮助。

答案 3 :(得分:0)

自己弄清楚了:)

刚刚放置

timestart = Time.now

在条件之间循环。不得不稍微更改代码以保持时间,但是计时器会在下一个循环的那一刻重置:->

真的很容易

答案 4 :(得分:0)

如果我对您尝试做的事情的理解是正确的:

timestart = Time.now

Individual.all.each do |f|

  puts Time.now-timestart #places the time it takes for each loop

  if Time.now-timestart < 60 # or some other condition of your choice
    timestart = Time.now
  end

end

应该很好地完成工作...

但是实际上,它不会在每个循环上重置timestart