Можно ли оценить кодовый блок, состоящий из нескольких строк кода, с помощью микробенчмарка? Если да, то как?
Пример: у нас есть некоторые числовые данные в символьных столбцах:
testdata <- tibble::tibble(col1 = runif(1000), col2 = as.character(runif(1000)), col3 = as.character(runif(1000)))
Теперь мы можем попробовать разные способы их преобразования. Мы можем напрямую вызвать as.numeric для столбцов:
testdata$col2 <- as.numeric(testdata$col2)
testdata$col3 <- as.numeric(testdata$col3)
Мы могли бы попробовать сделать это внутри мутации dplyr
:
testdata <- dplyr::mutate(testdata, col2 = as.numeric(col2),
col3 = as.numeric(col3))
Или, может быть, мы знаем, что все столбцы должны быть числовыми, поэтому мы можем попробовать что-то менее явное, выполняющее некоторую проверку:
testdata <- dplyr::mutate_if(testdata, .predicate = is.character, .funs = as.numeric)
Теперь мы хотим сравнить производительность этих трех вариантов.
Последние 2 варианта являются отдельными вызовами, поэтому их можно легко протестировать в микробенчмарке, но первый вариант состоит из двух отдельных вызовов. Мы могли бы обернуть два вызова в функцию, а затем оценить ее в микротесте, но это приводит к небольшим накладным расходам функции, поэтому технически не оценивает решение, которое у нас есть сейчас. Мы можем включить вызовы отдельно в микробенчмарк, а затем добавить их после, так как среднее значение должно работать нормально, но для таких вещей, как минимум или максимум, это не обязательно дает разумные результаты.
Примеры в документации для microbenchmark в основном используют простые отдельные выражения и часто используют простую функцию для переноса кода.
Можно ли напрямую ввести несколько строк кода в микробенчмарк для совместной оценки?