Существует ли в R стандартизированный способ измерения времени выполнения функции?
Очевидно, я могу взять system.time
до и после выполнения, а затем принять разницу, но я хотел бы знать, есть ли какой-то стандартизированный способ или функция (хотел бы не изобретать колесо).
Кажется, я помню, что когда-то использовал что-то вроде ниже:
somesysfunction("myfunction(with,arguments)")
> Start time : 2001-01-01 00:00:00 # output of somesysfunction
> "Result" "of" "myfunction" # output of myfunction
> End time : 2001-01-01 00:00:10 # output of somesysfunction
> Total Execution time : 10 seconds # output of somesysfunction
proc.time
в виду, потому чтоsystem.time
это то, что вам нужно.Rprof
это хорошо. Он обеспечивает профиль всех процессов в блоке кода / функции.require(microbenchmark)
теперь (с тех пор, как пару лет назад) стали стандартом для сообщества.times <- microbenchmark( lm(y~x), glm(y~x), times=1e3); example(microbenchmark)
, Это делает статистическое сравнениеlm
противglm
более 1000 попыток, а неsystem.time
испытывать только один раз.res <- microbenchmark(your code1,your code2)
а затем,print(res)
чтобы увидеть таблицу илиggplot2::autoplot(res)
увидеть коробку! refОтветы:
Другой возможный способ сделать это - использовать Sys.time ():
Не самый элегантный способ сделать это, по сравнению с приведенным выше ответом, но, безусловно, способ сделать это.
источник
Sys.time
, пожалуйста , прочитайте это какое - то предостережение: Timing R код с SYS.TIME ()system.time()
было быстрее для меня. Я думаю, что ответ заsystem.time()
должен быть принят!Встроенная функция
system.time()
сделает это.Используйте как:
system.time(result <- myfunction(with, arguments))
источник
system.time()
у этого аргументаgcFirst
естьTRUE
значение по умолчанию. Это, с одной стороны, делает измерения немного более воспроизводимыми, но может привести к значительным накладным расходам общего времени выполнения (которое не измеряется, конечно).system.time(result <- myfunction(with, arguments))
и получил 187.564 в качестве выхода - это в секундах или что?system.time
, пожалуйста, прочитайте это для некоторых предостережений: ошибки «объект не найден» и «неожиданный символ» при синхронизации R кода с system.time () .Как сказал Андри,
system.time()
отлично работает. Для краткости я предпочитаю вставитьreplicate()
в него:источник
Немного более приятный способ измерения времени выполнения - использовать rbenchmark. пакет . Этот пакет (легко) позволяет вам указать, сколько раз будет повторяться ваш тест и должен ли быть относительный эталон.
Смотрите также связанный вопрос на stats.stackexchange
источник
microbenchmark
это легкий (~ 50 КБ) пакет и более или менее стандартный способ в R для сравнения нескольких выражений и функций:Например:
Здесь оба выражения были оценены 10000 раз, со средним временем выполнения около 25-30 нс.
источник
А также есть
proc.time()
Вы можете использовать так же, как,
Sys.time
но это дает вам аналогичный результатsystem.time
.Основное различие между использованием
заключается в том, что
proc.time()
метод по-прежнему выполняет вашу функцию вместо того, чтобы просто измерять время ... и, кстати, мне нравится использоватьsystem.time
с{}
внутренней частью, чтобы вы могли поместить ряд вещей ...источник
Пакет «Tictoc» дает вам очень простой способ измерения времени выполнения. Документация находится по адресу : https://cran.fhcrc.org/web/packages/tictoc/tictoc.pdf .
Чтобы сохранить прошедшее время в переменной, вы можете сделать:
источник
Хотя другие решения полезны для одной функции, я рекомендую следующий фрагмент кода, который является более общим и эффективным:
источник
microbenchmark
илиprofvis
.Другой простой, но очень мощный способ сделать это - использовать пакет
profvis
. Он не только измеряет время выполнения вашего кода, но и позволяет детализировать каждую выполняемую вами функцию. Это может быть использовано и для Shiny.Нажмите здесь для некоторых примеров.
источник
Вы можете использовать MATLAB-стиль
tic
-toc
функции, если вы предпочитаете. Посмотрите этот другой ТАК вопросФункция секундомера в R
источник
proc.time()
... Мне больше нравится милое имя. =)