В настоящее время я тестирую некоторые из своих критически важных алгоритмов в R, и я ищу простой способ сделать эти тесты и получить четкое резюме. Поэтому я нашел пакет rbenchmark
, который часто используется. Но это не соответствует моим потребностям. Мои алгоритмы обычно зависят от некоторых параметров или существуют разные «типичные» наборы данных, которые должны быть доступны для тестирования в пакетном режиме.Лучший способ для тестов (анализ производительности) в R?
Мое текущее быстро-н-грязно-решение (с довольно глупым, но простым примером, где макс/медиана опробована на 10^6 и 5 * 10^6 случайных чисел)
library(rbenchmark)
multi.benchmarks <- function(..., settings) {
res <- NULL
for (i in 1:length(settings)) {
env <- new.env()
eval(settings[[i]], env)
tres <- benchmark(..., environment = env)
res <- rbind(res, cbind(names(settings)[i], tres))
}
names(res)[1] <- "setting"
return(res)
}
multi.benchmarks(mean = expression(mean(x)), median = expression(median(x)),
settings = list(s1 = expression({x <- runif(1E6)}),
s2 = expression({x <- runif(5E6)})),
replications = 3)
Этих возвращает:
setting test replications elapsed relative user.self sys.self user.child sys.child
1 s1 mean 3 0.00 NA 0.00 0.00 NA NA
2 s1 median 3 0.16 NA 0.14 0.01 NA NA
3 s2 mean 3 0.03 1 0.04 0.00 NA NA
4 s2 median 3 0.57 19 0.51 0.07 NA NA
, который более или менее то, что я хочу, но я до сих пор отсутствуют:
- более простой синтаксис (выражения считываются V ia
substitute(...)
и т. д.) и - более возможные параметры - например.
my_benchmark(algorithm(dataset, a, b), algorithm = list(func1, func2), a = list(1,2), b = list(10, 20), replications = 3)
будет хорошим способом запускать 8 различных тестов: для всех комбинаций func1/func2 и всех возможных значенийa
иb
. - Detect, которые PARAMS не нужны: Если
func1
имеет параметрыa
иb
иfunc2
только имеет параметрa
но неb
, то мы будем иметь только 6 возможных комбинаций. - Более подробный выход, например. возможность получения дополнительных столбцов для среднего значения и стандартного отклонения всех времен работы после N реплик.
Вероятно, это будет стоить мне всего пару дней, чтобы написать эталонный пакет, который способен сделать все эти вещи, и все еще имеет какое-то вниз совместимость с rbenchmark, но прежде чем начать делать это, я бы хотел бы задать вопрос:
- Есть ли другие рекомендуемые контрольные решения для R, которые я должен рассмотреть?
- Считаете ли вы, что более сложный пакет тестов с такими функциями будет представлять общий интерес для сообщества R? (Я думаю о новом пакете)
См. «Эффективность» Хэдли Уикхэма (http://adv-r.had.co.nz/Performance.html) – zx8754