R中的运行时比较:设置运行时阈值

时间:2018-07-27 08:15:13

标签: r microbenchmark

我正在使用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)

0 个答案:

没有答案