Сброс таймера вне петель - PullRequest
       9

Сброс таймера вне петель

0 голосов
/ 29 октября 2018

Я установил таймер для функции, которую я синхронизирую, но хочу сбросить ее после выполнения условия

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 голосов
/ 29 октября 2018

Если мое понимание того, что вы пытаетесь сделать, является правильным:

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 в каждом цикле

0 голосов
/ 29 октября 2018

Разобрался сам :) 1001 *

только что поместил

timestart = Time.now

в цикле между условиями. Пришлось немного изменить код, чтобы сохранить время, но таймер сбрасывается в этот момент для следующего цикла: ->

Довольно просто на самом деле

0 голосов
/ 29 октября 2018

Вы можете рассчитать это.

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

time_per_each = time / quantity.to_f

Ответ вы получите в миллисекундах, просто переведите.

Надеюсь, это поможет вам.

0 голосов
/ 29 октября 2018

Ответ на ваш вопрос в виде простого 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 секундам», хотя итерация цикла заняла всего секунду.

Но у тебя могут быть свои причины :)

0 голосов
/ 29 октября 2018

Вот как вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...