0
time_limit = gets.to_f * 60
start_time = Time.new
end_time = start_time + time_limit
x = 1
until Time.new >= end_time
  time_left = end_time - Time.new
  time_left_in_minutes = time_left / 60
  puts "Minutes Left: #{time_left_in_minutes}"
end
until x == 0
puts "Time Since End of #{time_limit / 60} Minutes: #{Time.new - end_time}"
end

コンピューターのファンがフル スピードで回転し、このコードを実行するとコンピューターの音が大きくなります。プロセッサにとってそれほど多くの作業を行わない、これを行うためのより良い方法はありますか?

4

2 に答える 2

2

タイムアウトを待っている間、ループが忙しいため、コンピュータが熱くなります。

最も簡単な解決策:ループにsleep(1)を追加します。これにより、可能な限り高速ではなく、1秒に1回実行されます。

代わりに、正しい秒数だけスリープすることもできます。

次に、一定時間待った後、xがどういうわけか0になるまでビジーループします。これも多くのCPUを使用します。

于 2012-10-13T21:35:19.967 に答える
2

これは、プロセッサに多くの作業を要求しているためです。

あなたのループを見てください:

until Time.new >= end_time
  time_left = end_time - Time.new
  time_left_in_minutes = time_left / 60
  puts "Minutes Left: #{time_left_in_minutes}"
end

それが制限時間までぐるぐるぐるぐる回る。あなたのプロセッサは、常に動き続けています。(ここではコストのかかることもいくつか実行しています。Time.new各反復で 2 回呼び出し、オブジェクトの作成にはコストがかかる可能性があります。ただし、ループが高速である場合は、高速にスピンするだけです。)

おそらく、そのループに遅延を追加して、1 秒に 1 回、または 1 分に 1 回などのように実行する必要があります。 sleep 30たとえば、30 秒間一時停止します。

于 2012-10-13T21:35:36.680 に答える