Таймер в производительности Ruby

Я искал пример онлайн, демонстрирующий таймер в рубине, и столкнулся с кодом ниже. Это работает как ожидалось, но это имеет смысл, что эта простая программа использует 30 мес памяти (как показано в диспетчере задач окон) и слишком много ЦП?

Большое спасибо

def time_block
  start_time = Time.now
  Thread.new { yield }
  Time.now - start_time
end

def repeat_every(seconds)
  while true do
    time_spent = time_block { yield } # To handle -ve sleep interaval
    sleep(seconds - time_spent) if time_spent < seconds
  end
end

repeat_every(5) {
}
5
задан Daniel Rikowski 17 February 2010 в 09:04
поделиться

1 ответ

Вам необходимо использовать свой первый синтаксис, и если вы используете класс вне решения Visual Studio, необходимо проверить файл XML-документации в свойствах проекта.

-121--3977885-

Я бы нашел пару демонстрационных приложений Silverlight и просмотрел источник. Тогда я бы определить очень простой проект, и, как было предложено другими, и код полного маленького приложения. Затем я выбросил приложение и сделал это снова с опытом и знаниями, которые вы получили от первой итерации.

-121--3266089-

Как отмечено в комментариях к вопросу, все, что нужно для того, чтобы это сработало, это то, что вы присоединяетесь к потоку:

#!/usr/bin/ruby1.8

def repeat_every(interval, &block)
  loop do
    start_time = Time.now
    Thread.new(&block).join
    elapsed = Time.now - start_time
    sleep([interval - elapsed, 0].max)
  end
end

repeat_every(5) do
  puts Time.now.to_i
end

# => 1266437822
# => 1266437827
# => 1266437832
...

Однако на месте нет причин использовать потоки для кода в вопросе:

def repeat_every(interval)
  loop do
    start_time = Time.now
    yield
    elapsed = Time.now - start_time
    sleep([interval - elapsed, 0].max)
  end
end

repeat_every(5) do
  puts Time.now.to_i
end

# => 1266437911
# => 1266437916
# => 1266437921

Теперь, если вы хотите поток, который делает что-то через промежутки времени, так что основная программа может сделать что-то другое, то вы завернете весь этот цикл в поток.

def repeat_every(interval)
  Thread.new do
    loop do
      start_time = Time.now
      yield
      elapsed = Time.now - start_time
      sleep([interval - elapsed, 0].max)
    end
  end
end

thread = repeat_every(5) do
  puts Time.now.to_i
end  
puts "Doing other stuff..."
thread.join

# => 1266438037
# => Doing other stuff...
# => 1266438042
# => 1266438047
11
ответ дан 13 December 2019 в 19:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: