【问题标题】:benchmarking: set maximum number of runtime基准测试:设置最大运行时间
【发布时间】:2021-09-25 15:42:16
【问题描述】:

有没有办法通过常见的 R 基准测试包之一(例如 rbenchmarkmicrobenchmarkbench)设置评估表达式运行时的最长时间?我正在比较一种算法的两种实现,一种在几秒钟内运行,另一种需要几分钟——如果可能的话,我想将“较慢”算法中使用的“最大”运行时间限制为特定时间。基准测试的总体目的不是为两种算法获得准确的时序基准,而是证明其中一种算法的速度要快几个数量级。

【问题讨论】:

标签: r benchmarking


【解决方案1】:

这样做

library(microbenchmark)

f1 = function(t) Sys.sleep(t+rnorm(1, sd=0.01))
maxdif = 10

mb = microbenchmark(f1(.1), f1(.2), times=1)
if(abs(mb$time[1]-mb$time[2])/1000000>maxdif) {
  mb} else {microbenchmark(f1(.1), f1(.2), times=10)}
# Unit: milliseconds
# expr       min        lq     mean   median       uq      max neval
# f1(0.1)  90.00902  98.01966 101.7992 102.9737 106.0218 112.8290    10
# f1(0.2) 188.00302 197.09390 201.1029 202.4914 205.0135 208.9931    10

mb = microbenchmark(f1(.1), f1(5), times=1)
if(abs(mb$time[1]-mb$time[2])/1000000>maxdif) {
  mb} else {microbenchmark(f1(.1), f1(5), times=10)}
# Unit: milliseconds
# expr      min       lq     mean   median       uq      max neval
# f1(0.1)  103.021  103.021  103.021  103.021  103.021  103.021     1
# f1(5) 5010.939 5010.939 5010.939 5010.939 5010.939 5010.939     1

首先,我检查单个函数执行的差异,如果小于maxdif 秒,我对 20 个调用进行比较。

【讨论】:

    【解决方案2】:

    以@r2evans 的回答为基础,使用base::SetTimeLimit

    library(bench)
    
    sum_x <- function(x){
      res <- 0
      for(i in seq_along(x)){
        res <- res + x[i]
      }
      res
    }
    
    x <- rnorm(1e8)
    sum_x(x)
    sum(x)
    
    max_time <- 0.1
    
    bench::mark("loop" = sum_x(x),
                "loop_capped" = tryCatch(expr = {setTimeLimit(max_time); sum_x(x)}, error = function(x){return(NA)}),
                "base" = sum(x), 
                iterations = 10, 
                check = FALSE)
    
    # # A tibble: 3 x 13
    # expression       min   median `itr/sec` mem_alloc `gc/sec` n_itr  n_gc total_time
    # <bch:expr>  <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl> <int> <dbl>   <bch:tm>
    #   1 loop           2.95s    4.48s     0.231        0B        0    10     0     43.38s
    # 2 loop_capped 102.72ms 110.53ms     9.19         0B        0    10     0      1.09s
    # 3 base        124.78ms 142.31ms     6.89         0B        0    10     0      1.45s
    # # ... with 4 more variables: result <list>, memory <list>, time <list>, gc <list>
    
    

    请注意,我将运行时设置为 0.1s,tryCatchSetTimeLimit 会增加一点开销(当计算时间超过 0.1s 时,这无关紧要)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2022-01-20
      相关资源
      最近更新 更多