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

184

Существует ли стандартизированный способ в 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 хорош. Он предоставляет профиль всех процессов в блоке кода / функции.
Показать ещё 1 комментарий
Теги:
time
profiling

9 ответов

162

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

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

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

  • 11
    Это намного более эффективно использует память, чем system.time (), которая эффективно копирует свои аргументы. Это важно, когда вы имеете дело с данными, которые едва умещаются в вашей оперативной памяти.
  • 1
    Для людей, которые используют Sys.time , пожалуйста, прочтите это для некоторого предостережения: Timing R-код с Sys.time ()
136

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

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

  • 0
    Важно знать, что system.time() имеет аргумент gcFirst который по умолчанию равен TRUE . Это, с одной стороны, делает измерение немного более воспроизводимым, но может привести к значительным накладным расходам на общее время выполнения (которое не измеряется, конечно).
  • 1
    в какой единице это измеряется? например, я просто запустил system.time(result <- myfunction(with, arguments)) и получил 187.564 в качестве вывода - это в секундах или как?
Показать ещё 1 комментарий
45

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

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

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

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

  • 5
    Микробенчмарк еще лучше, потому что он использует функции синхронизации высокой точности.
  • 4
    @hadley Но rbenchmark более удобен для сравнения. Для меня микробенчмарк - это модернизированный system.time. rmicrobenchmark - это то, что нам нужно :)
Показать ещё 1 комментарий
21

Существует также proc.time()

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

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

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

system.time({ #your function here })

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

13

Пакет "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
8

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 раз, при среднем выполнении около 20-30 мс.

8

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

Rprof ( tf <- "log.log",  memory.profiling = TRUE )
your code must be in between
Rprof ( NULL ) ; print ( summaryRprof ( tf )  )
8

Вы можете использовать функции MATLAB tic - toc, если хотите. См. Этот другой вопрос SO

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

  • 0
    proc.time() добавить proc.time() … мне больше нравится симпатичное имя. знак равно

Ещё вопросы

Сообщество Overcoder
Наверх
Меню