Время выполнения функции измерения в 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

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

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


14
Это намного более эффективно использует память, чем system.time (), которая эффективно копирует свои аргументы. Это важно, когда вы имеете дело с данными, которые едва умещаются в вашей оперативной памяти.
Адам Рычковски

2
Для людей , которые используют Sys.time, пожалуйста , прочитайте это какое - то предостережение: Timing R код с SYS.TIME ()
李哲源

1
system.time()было быстрее для меня. Я думаю, что ответ за system.time()должен быть принят!
Гванг-Джин Ким

Это мой предпочтительный способ узнать, сколько времени занимает длительный параллельный расчет на нескольких ядрах. В этом случае время настенных часов, измеренное с помощью этого вызова, является достаточно точным, так как компьютер будет гораздо более загружен, поскольку все ядра будут вычисляться, а не делать что-либо еще, а вычисления будут занимать минуты или часы. Это очень специфический вариант использования, но стоит упомянуть.
Пабло Адамс

186

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

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


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


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))

2
Я не знал о Rprof до сих пор, и это действительно здорово! плюс он поставляется с базой R, поэтому нет необходимости в дополнительной упаковке как microbenchmarkили profvis.
Саймон С.

Интересно, можно ли визуализировать rprof, например, если мы хотим построить график времени для каждого элемента, который он профилирует?
Завир Амин

@ZawirAmin Есть способ, просто используйте Rstudio >> меню профиля
TPArrow

13

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

library(profvis)

profvis({
  #your code here
})

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.