使用Sys.time()计时R代码

时间:2018-07-09 01:07:30

标签: r time while-loop

我可以使用以下代码将一段代码运行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 个答案:

答案 0 :(得分:18)

经过的时间超过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"’.

或者使用proc.time,自您在几秒钟内开始R会话以来,它会测量不同的时间(“用户”,“系统”,“经过”)。我们需要“经过的”时间,即挂钟时间,因此我们检索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(一个小时以上),则默认单位将更改为“小时”。

使用Sys.time时请注意时间单位,否则您可能会被基准测试所迷惑。这是一个完美的示例:Unexpected results in benchmark of 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

“用户”时间和“系统”时间均为0,因为CPU和系统内核均处于空闲状态。