我正在尝试自动执行所有顶级表达式。 Task Handlers几乎是所需要的,但只有在命令完成后才会调用它们,而不是之前。
另一种方法是修改要包含在system.time
中的每个顶级表达式,但是我不知道这样做的方法。
答案 0 :(得分:8)
为了完整性,这里有一个函数,您可以将其用作任务回调,以自动为任何需要超过5秒的顶级命令发出系统通知。
# devtools::install_github("gaborcsardi/notifier")
notify_long_running <- function(second_cutoff = 5) {
last <- proc.time()[1]
function(expr, value, ok, visible) {
duration <- proc.time()[1] - last
if (duration > second_cutoff) {
notifier::notify(msg = paste0(collapse = " ", deparse(expr)),
title = sprintf("Completed in %.02f (s)", duration))
}
last <<- proc.time()[1]
TRUE
}
}
addTaskCallback(notify_long_running())
答案 1 :(得分:2)
迟了两年,但尝试使用此解决方案自动计时所有命令:
proc <- function(...) {
utime <- proc.time()[1]
utime_diff <- utime-get0(".prev_time", envir=globalenv(), ifnotfound=0)
options(prompt=paste0(utime_diff,"s> "))
assign(".prev_time", utime, envir=globalenv())
return(TRUE)
}
ret <- addTaskCallback(proc)
proc.time返回的“用户时间”在空闲时不会增加,因此它只会计算运行命令所花费的时间。
这使你非常接近准确的测量,至少到10秒:
start_time <- proc.time()[1]
st_time <- system.time({for(x in 1:10000000) {
log(x)
}})[1]
pt_time <- proc.time()[1] - start_time
print(paste("time using proc.time()", pt_time))
print(paste("time using syste.time()", st_time))
“时间使用proc.time()1.908”
“时间使用syste.time()1.884”
答案 2 :(得分:-2)
没有真正的方法来分析“顶级命令”,因为R不知道那些是什么。你是如何定义它们的?
如果system.time对你来说不够精细(因为它没有查看单个代码片段),我的建议是反方向并使用Rprof,这样你就可以开始并停止表达式的时间,并在输出(summaryRprof()
)上按函数调用打印细分。请注意,这是通过函数调用,而不是通过“顶级函数”调用:如果您正在寻找R来基准您认为是顶级函数的基准,{{1可能确实是你最好的选择