web-dev-qa-db-ja.com

Sys.time()によるタイミングRコード

次のコードを使用して、コードの一部を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分間実行しても、コードが停止することはありません。なにが問題ですか?

10

経過時間が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です。

21
李哲源