2014-09-05 2 views
1

В настоящее время я тестирую некоторые из своих критически важных алгоритмов в 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? (Я думаю о новом пакете)
+0

См. «Эффективность» Хэдли Уикхэма (http://adv-r.had.co.nz/Performance.html) – zx8754

ответ

2

Вопросы «Ищете инструмент» больше не рассматриваются в качестве подходящего, чтобы кто-то быстро застрелил это.

Но посмотрите на microbenchmark, он по крайней мере возвращает набор результатов, чтобы вы могли сделать больше резюме - я использовал это для некоторых пользовательских «скрипки» в пакете/виньетке RcppZiggurat.

И последнее, но не менее важное: новый тестовый пакет «meta» может иметь смысл, особенно если вы хорошо его интегрируете с существующими пакетами времени/профилирования/сравнения, а не заново изобретаете (более или менее) одно и то же колесо.

+0

Спасибо за идею с помощью «microbenchmark»! Я знаю, что вопросы здесь не должны состоять в обсуждении мнений, но я надеялся, что предоставление моего существующего подхода сфокусирует этот вопрос на технических аспектах бенчмаркинга в Р. –

Смежные вопросы