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

Posted

技术标签:

【中文标题】使用 Sys.time() 计时 R 代码【英文标题】:Timing R code with Sys.time() 【发布时间】:2018-12-16 15:25:14 【问题描述】:

我可以使用以下代码运行一段代码 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"’.

或者使用proc.time,它以秒为单位测量自您开始 R 会话以来的各种时间(“用户”、“系统”、“经过”)。我们想要“经过”的时间,即挂钟时间,所以我们检索proc.time() 的第三个值。

period <- 10
tm <- proc.time()[[3]]
while (proc.time()[[3]] - tm < period) print(proc.time())

如果您对[[1]][[3]]的使用感到困惑,请咨询:

How do I extract just the number from a named number (without the name)? How to get a matrix element without the column name in R?

让我添加一些用户友好的可重现示例。您在循环中带有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和系统内核都是空闲的。

【讨论】:

以上是关于使用 Sys.time() 计时 R 代码的主要内容,如果未能解决你的问题,请参考以下文章

统计代码运行时间计时器

R语言sys方法:sys.chmod函数改变指定文件的权限Sys.Date函数返回系统的当前日期Sys.time函数返回系统的当前时间

需要关于使用 libevent 动态更改计时器事件的建议

libevent:使计时器持久化

R语言学习日期与时间

C中的计时函数[重复]