Час виконання функції вимірювання в 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, будь ласка, ознайомтесь із цим застереженням: Код часу R за допомогою Sys.time ()
李哲源

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

Це мій кращий спосіб дізнатися час, який потрібен для тривалого обчислення, зробленого паралельно на декількох ядрах. У цьому випадку час настінного годинника, виміряний за допомогою цього дзвінка, є досить точним, оскільки комп'ютер буде набагато зайнятішим, обчислюючи всі ядра, ніж робити що-небудь інше, а на завершення розрахунків потрібно кілька хвилин або годин. Це дуже специфічний випадок використання, але варто згадати.
Пабло Адамес

186

Вбудована функція system.time()це зробить.

Використовуйте як: system.time(result <- myfunction(with, arguments))


1
Важливо знати, що system.time()аргумент gcFirstє TRUEза замовчуванням. Це, з одного боку, робить вимірювання трохи відтворюваним, але може генерувати значні витрати загального часу виконання (який не вимірюється, поза курсом).
jakob-r

2
в якій одиниці це вимірюється? наприклад, я просто побіг system.time(result <- myfunction(with, arguments))і отримав 187.564 як вихід - це за секунди чи що?
zsad512

Для людей, які використовують system.time, будь ласка, прочитайте це за деякими застереженнями: «помилка об’єкта не знайдена» та «несподіваний символ» під час синхронізації коду R з system.time () .
李哲源

@ zsad512 Я впевнений, що це секунди .
Tapper

58

Як сказав Андрі, system.time()працює чудово. Для короткої функції я вважаю за краще вкласти replicate()її:

system.time( replicate(10000, myfunction(with,arguments) ) )

28
Ви краще скористаєтесь пакетом microbenchmark, оскільки він не включає накладні витрати репліка в терміни.
hadley

37

Трохи приємніший спосіб вимірювання часу виконання - використання пакету rbenchmark . Цей пакет (легко) дозволяє вказати, скільки разів потрібно повторити тест і чи повинен бути відносний показник.

Дивіться також пов'язане питання на сайті stats.stackexchange


6
Microbenchmark ще кращий, оскільки він використовує функції більш високої точності синхронізації.
хадлі

4
@hadley Але rbenchmark є більш зручним для користувачів у випадку порівнянь. Для мене microbenchmark - оновлений system.time. rmicrobenchmark - це те, що нам потрібно :)
Marek

3
Обслуговувач мікробензика дуже чуйний - я думаю, що він додасть все, що вам потрібно.
hadley

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. Він не просто вимірює час виконання коду, але дає вам детальну інформацію про кожну функцію, яку ви виконуєте. Його можна використовувати і для Блискучого.

library(profvis)

profvis({
  #your code here
})

Клацніть тут для декількох прикладів.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.