Есть ли что-нибудь похожее на микробенчмарк, но показывающее, как часто происходит сбой кода? - PullRequest
1 голос
/ 06 мая 2020

Итак, мне нужно что-то вроде microbenchmark, но вместо того, чтобы рассчитывать свой код, я хочу знать, как часто он терпит неудачу (если вообще). По сути, я хочу протестировать что-то вроде

f1 <- function(x){
  x^2 - 1
}

lims <- rnorm(2)

try(uniroot(f1, lims))

большое количество раз (скажем, 10 ^ 6 тестов), а затем записать частоту, с которой это не удается. Конечно, в этом простом примере все сводится к одному из 1 или -1 в lims. В общем, я этого не знаю.

Мне нужно решить многочлен как часть блестящего приложения. Я хочу, чтобы приложение было как можно более чистым, поэтому я хочу, чтобы пользователь не указывал ограничения uniroot. Поэтому я написал адаптивный метод, несколько симуляций показывают, что он работает, но я хочу протестировать его много раз.

1 Ответ

4 голосов
/ 06 мая 2020

Вероятно, так же легко написать свою собственную функцию для этого. Возможно, что-то вроде:

count_failures <- function(f, n = 1e3, ...)
{
  n_failures <- 0
  for(i in seq(n))
  {
    tryCatch(f(...), error = function(e) n_failures <<- n_failures + 1)
  }
  cat("Function \"", deparse(substitute(f)), "\" failed on ", n_failures,
      " out of ", n, " runs. (", 100*n_failures/n, "%)\n", sep = "")
}

Теперь посмотрим, как это работает с вашей настройкой:

f1 <- function(x){
  x^2 - 1
}

f2 <- function()
{
  lims <- rnorm(2)
  uniroot(f1, lims)
}

count_failures(f2)
#> Function "f2" failed on 552 out of 1000 runs. (55.2%)

count_failures(f2, 1e5)
#> Function "f2" failed on 56702 out of 1e+05 runs. (56.702%)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...