次のコードを使用して、コードの一部を5秒または10秒実行できます。
period <- 10 ## minimum time (in seconds) that the loop should run for
tm <- Sys.time() ## starting data & time
while(Sys.time() - tm < period) print(Sys.time())
コードは5秒間または10秒間問題なく実行されます。しかし、期間の値を60に置き換えて1分間実行しても、コードが停止することはありません。なにが問題ですか?
経過時間が1分を超えると、デフォルトの単位は秒から分に変わります。だからあなたはユニットを制御したい:
_while (difftime(Sys.time(), tm, units = "secs")[[1]] < period)
_
_?difftime
_から
_ If ‘units = "auto"’, a suitable set of units is chosen, the
largest possible (excluding ‘"weeks"’) in which all the absolute
differences are greater than one.
Subtraction of date-time objects gives an object of this class, by
calling ‘difftime’ with ‘units = "auto"’.
_
または、Rセッションを数秒で開始してからのさまざまな時間(「ユーザー」、「システム」、「経過」)を測定する_proc.time
_を使用します。 「経過」時間、つまり実時間が必要なので、proc.time()
の3番目の値を取得します。
_period <- 10
tm <- proc.time()[[3]]
while (proc.time()[[3]] - tm < period) print(proc.time())
_
_[[1]]
_と_[[3]]
_の使用について混乱している場合は、以下を参照してください。
ユーザーフレンドリーな再現可能な例をいくつか追加しましょう。ループ内にprint
を含む元のコードは、画面に数千行を出力するため、非常に煩わしいものです。 _Sys.sleep
_を使用します。
_test.Sys.time <- function(sleep_time_in_secs) {
t1 <- Sys.time()
Sys.sleep(sleep_time_in_secs)
t2 <- Sys.time()
## units = "auto"
print(t2 - t1)
## units = "secs"
print(difftime(t2, t1, units = "secs"))
## use '[[1]]' for clean output
print(difftime(t2, t1, units = "secs")[[1]])
}
test.Sys.time(5)
#Time difference of 5.005247 secs
#Time difference of 5.005247 secs
#[1] 5.005247
test.Sys.time(65)
#Time difference of 1.084357 mins
#Time difference of 65.06141 secs
#[1] 65.06141
_
「自動」ユニットは非常に賢いです。 _sleep_time_in_secs = 3605
_(1時間以上)の場合、デフォルトの単位は「時間」に変更されます。
_Sys.time
_を使用するときは時間単位に注意してください。そうしないと、ベンチマークにだまされる可能性があります。これが完全な例です: read.csv/freadのベンチマークでの予期しない結果 。私は今削除されたコメントでそれに答えていました:
時間単位で問題が発生しました。
fread
の方が20倍以上速いことがわかります。fread
がファイルの読み取りに4秒かかる場合、_read.csv
_は80秒= 1.33分かかります。単位を無視すると、_read.csv
_は「高速」です。
次に、_proc.time
_をテストします。
_test.proc.time <- function(sleep_time_in_secs) {
t1 <- proc.time()
Sys.sleep(sleep_time_in_secs)
t2 <- proc.time()
## print user, system, elapsed time
print(t2 - t1)
## use '[[3]]' for clean output of elapsed time
print((t2 - t1)[[3]])
}
test.proc.time(5)
# user system elapsed
# 0.000 0.000 5.005
#[1] 5.005
test.proc.time(65)
# user system elapsed
# 0.000 0.000 65.057
#[1] 65.057
_
CPUとシステムカーネルの両方がアイドル状態であるため、「ユーザー」時間と「システム」時間は0です。