我正在使用mcirobenchmark
来比较某些函数的运行时间,并重复此过程以增加输入向量。有些函数可能需要很长时间,我不想等待那么长时间,所以我想中止这些慢速函数的计算,而只返回NA
作为这些表达式的时间值。有没有一种方法可以设置阈值,以便一旦达到此阈值,microbenchmark
(或应用rbenchmark
程序包)就会中止?谢谢!
在下面的文章中,我提出了快速而又肮脏的解决方法,在该方法中,我建议以前输入的运行时是否超过阈值,并防止将来为更大的输入速度执行。 df
存储此信息。
这并不是我想要的,因为通常执行时间不会随输入大小的增加而单调增加。
df <- data.frame(expr = c("foo1(x,y)",
"foo2(x,y)",
"foo3(x,y)"),
doit = TRUE, stringsAsFactors = FALSE)
cond_mic <- function(expr, df, repetitions, threshold, nn){
if(df[df$expr == expr, "doit"]){
mic <- microbenchmark::microbenchmark(eval(parse(text = expr)),
times = repetitions)
mic <- data.frame(expr = expr, times = mic$time,
nn=nn, stringsAsFactors = FALSE)
if(median(mic$time) > threshold){
df[df$expr == expr, "doit"] <- FALSE
}
}else{
mic <- data.frame(expr = rep(expr, repetitions), times = NA,
nn=nn, stringsAsFactors = FALSE)
}
return(list(mic = mic, df = df))
}
REPETITIONS <- 2
#THRESHOLD <- 60 * 10^9# 1 minute in nano seconds
#THRESHOLD <- 1 * 10^9# 1 sec in nano seconds
THRESHOLD <- 1 * 10^6# 1 millisec in nano seconds
mics <- list()
for(nn in seq(10, 100, 30)){
set.seed(nn)
x <- rnorm(nn)
y <- rnorm(nn)
for(i in 1:nrow(df)){
tmp <- cond_mic(df$expr[i], df, REPETITIONS, THRESHOLD, nn)
df <- tmp$df
mics[[length(mics)+1]] <- tmp$mic
}
}
mics <- do.call(rbind, mics)