为命令启动定义回调

问题描述:

我正在尝试自动执行所有顶级表达式的执行时间。 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“

+0

这听起来像一个很好的解决方法,谢谢回答,我从来没有想过使用这个用户时间。 – Jim 2016-12-04 03:43:31

有没有真正的方法来配置“顶级命令”,因为R不知道这些是什么。你如何定义它们?

如果system.time对于你来说粒度不够(因为它没有看单独的代码段),我的建议是去相反的方向并使用Rprof,它允许你启动和停止表达式的计时和输出(summaryRprof())按函数调用打印细分。请注意,这是通过函数调用,而不是通过“顶级函数”调用:如果您正在寻找专门针对R作为顶级函数的基准测试,system.time确实可能是您最好的选择

+0

我很抱歉没有更清楚。我没有system.time的时间问题,但是我不能在执行后回调中使用它,因为这个命令已经执行了。我还需要一个预执行回调。此外,顶级表达式仅仅是没有父表达式的表达式,任务回调仅在它们之后执行,这就是为什么我在问题中提到它们的原因。 – Jim 2014-11-25 15:05:56

+0

啊哈!误会 - 我的歉意。 – 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()) 
+0

嘿@Jim我不知道我在理解什么是“顶级命令”的意思......我安装了通知程序,然后粘贴并运行上面的代码。运行Sys.sleep(8)'应该会发出通知之后正确? – Moderat 2016-12-05 02:49:18

+0

不,这使用用户时间,没有经过时间,并且睡眠不会改变用户时间。有关更多信息,请参阅'?proc.time'。我们需要使用用户时间,因为经过的时间将包括仅仅坐在命令提示符下的空闲时间。为了测试它,你需要实际做些事情,例如对于(我在1:100000000)i + 1“ – Jim 2016-12-05 20:22:29