为命令启动定义回调
我正在尝试自动执行所有顶级表达式的执行时间。 Task Handlers几乎是需要的,但是只有在命令完成后才会调用它们,而不是之前。为命令启动定义回调
另一种方法是修改每个顶级表达式以包装在system.time
中,但是我不知道要做到这一点的方法。
晚两年,但尝试这种解决方案能够自动时间所有命令:
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“
有没有真正的方法来配置“顶级命令”,因为R不知道这些是什么。你如何定义它们?
如果system.time对于你来说粒度不够(因为它没有看单独的代码段),我的建议是去相反的方向并使用Rprof,它允许你启动和停止表达式的计时和输出(summaryRprof()
)按函数调用打印细分。请注意,这是通过函数调用,而不是通过“顶级函数”调用:如果您正在寻找专门针对R作为顶级函数的基准测试,system.time
确实可能是您最好的选择
我很抱歉没有更清楚。我没有system.time的时间问题,但是我不能在执行后回调中使用它,因为这个命令已经执行了。我还需要一个预执行回调。此外,顶级表达式仅仅是没有父表达式的表达式,任务回调仅在它们之后执行,这就是为什么我在问题中提到它们的原因。 – Jim 2014-11-25 15:05:56
啊哈!误会 - 我的歉意。 – 2014-11-25 15:07:18
为了完整起见,这里是一个函数,您可以将其用作任务回调,以自动为任何需要运行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())
这听起来像一个很好的解决方法,谢谢回答,我从来没有想过使用这个用户时间。 – Jim 2016-12-04 03:43:31