Время выполнения функции измерения в R

282

Существует ли в 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
DNS
источник
2
Я думаю, что вы имели proc.timeв виду, потому что system.timeэто то, что вам нужно.
Марек
1
Для больших функций Rprofэто хорошо. Он обеспечивает профиль всех процессов в блоке кода / функции.
Rich Scriven
38
Новые пользователи R, которые нашли этот вопрос через google: 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
Трэвис

Ответы:

253

Другой возможный способ сделать это - использовать Sys.time ():

start.time <- Sys.time()
...Relevent codes...
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

Не самый элегантный способ сделать это, по сравнению с приведенным выше ответом, но, безусловно, способ сделать это.

Shreyes
источник
14
Это намного более эффективно использует память, чем system.time (), которая эффективно копирует свои аргументы. Это важно, когда вы имеете дело с данными, которые едва умещаются в вашей оперативной памяти.
Адам Рычковски
2
Для людей , которые используют Sys.time, пожалуйста , прочитайте это какое - то предостережение: Timing R код с SYS.TIME ()
李哲源
1
system.time()было быстрее для меня. Я думаю, что ответ за system.time()должен быть принят!
Гванг-Джин Ким
Это мой предпочтительный способ узнать, сколько времени занимает длительный параллельный расчет на нескольких ядрах. В этом случае время настенных часов, измеренное с помощью этого вызова, является достаточно точным, так как компьютер будет гораздо более загружен, поскольку все ядра будут вычисляться, а не делать что-либо еще, а вычисления будут занимать минуты или часы. Это очень специфический вариант использования, но стоит упомянуть.
Пабло Адамс
186

Встроенная функция system.time() сделает это.

Используйте как: system.time(result <- myfunction(with, arguments))

Andrie
источник
1
Важно знать, что system.time()у этого аргумента gcFirstесть TRUEзначение по умолчанию. Это, с одной стороны, делает измерения немного более воспроизводимыми, но может привести к значительным накладным расходам общего времени выполнения (которое не измеряется, конечно).
Якоб-р
2
в какой единице это измеряется? например, я просто побежал system.time(result <- myfunction(with, arguments))и получил 187.564 в качестве выхода - это в секундах или что?
zsad512
Для людей, которые используют system.time, пожалуйста, прочитайте это для некоторых предостережений: ошибки «объект не найден» и «неожиданный символ» при синхронизации R кода с system.time () .
李哲源
@ zsad512 Я уверен, что это секунды .
Таппер
58

Как сказал Андри, system.time()отлично работает. Для краткости я предпочитаю вставить replicate()в него:

system.time( replicate(10000, myfunction(with,arguments) ) )
Саша Эпскамп
источник
28
Вам лучше использовать пакет microbenchmark, потому что он не включает в себя издержки репликации во времени.
Хэдли
37

Немного более приятный способ измерения времени выполнения - использовать rbenchmark. пакет . Этот пакет (легко) позволяет вам указать, сколько раз будет повторяться ваш тест и должен ли быть относительный эталон.

Смотрите также связанный вопрос на stats.stackexchange

csgillespie
источник
6
Микробенчмарк еще лучше, потому что он использует функции синхронизации высокой точности.
Хэдли
4
@hadley Но rbenchmark более удобен для сравнения. Для меня микробенчмарк - это модернизированный system.time. rmicrobenchmark - это то, что нам нужно :)
Marek
3
Сопровождающий микробенчмарк довольно отзывчив - держу пари, он добавил бы все, что вам нужно.
Хэдли
34

microbenchmark это легкий (~ 50 КБ) пакет и более или менее стандартный способ в R для сравнения нескольких выражений и функций:

microbenchmark(myfunction(with,arguments))

Например:

> microbenchmark::microbenchmark(log10(5), log(5)/log(10), times = 10000)
Unit: nanoseconds
           expr min lq    mean median uq   max neval cld
       log10(5)   0  0 25.5738      0  1 10265 10000   a
 log(5)/log(10)   0  0 28.1838      0  1 10265 10000

Здесь оба выражения были оценены 10000 раз, со средним временем выполнения около 25-30 нс.

Давор Йосипович
источник
32

А также есть proc.time()

Вы можете использовать так же, как, Sys.timeно это дает вам аналогичный результат system.time.

ptm <- proc.time()
#your function here
proc.time() - ptm

Основное различие между использованием

system.time({ #your function here })

заключается в том, что proc.time()метод по-прежнему выполняет вашу функцию вместо того, чтобы просто измерять время ... и, кстати, мне нравится использовать system.timeс {}внутренней частью, чтобы вы могли поместить ряд вещей ...

Родриго де Александр
источник
25

Пакет «Tictoc» дает вам очень простой способ измерения времени выполнения. Документация находится по адресу : https://cran.fhcrc.org/web/packages/tictoc/tictoc.pdf .

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
toc()

Чтобы сохранить прошедшее время в переменной, вы можете сделать:

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
exectime <- toc()
exectime <- exectime$toc - exectime$tic
Антон
источник
18

Хотя другие решения полезны для одной функции, я рекомендую следующий фрагмент кода, который является более общим и эффективным:

Rprof(tf <- "log.log", memory.profiling = TRUE)
# the code you want to profile must be in between
Rprof (NULL) ; print(summaryRprof(tf))
TPArrow
источник
2
Я не знал о Rprof до сих пор, и это действительно здорово! плюс он поставляется с базой R, поэтому нет необходимости в дополнительной упаковке как microbenchmarkили profvis.
Саймон С.
Интересно, можно ли визуализировать rprof, например, если мы хотим построить график времени для каждого элемента, который он профилирует?
Завир Амин
@ZawirAmin Есть способ, просто используйте Rstudio >> меню профиля
TPArrow
13

Другой простой, но очень мощный способ сделать это - использовать пакет profvis. Он не только измеряет время выполнения вашего кода, но и позволяет детализировать каждую выполняемую вами функцию. Это может быть использовано и для Shiny.

library(profvis)

profvis({
  #your code here
})

Нажмите здесь для некоторых примеров.

Джанни
источник
11

Вы можете использовать MATLAB-стиль tic- tocфункции, если вы предпочитаете. Посмотрите этот другой ТАК вопрос

Функция секундомера в R

Ричи Коттон
источник
Собирался добавить proc.time()... Мне больше нравится милое имя. =)
изоморфизм