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

Есть ли функция таймера R или секундомера, аналогичная MATLAB tic/toc?

Ответ 1

В R есть много инструментов для профилирования, как сказал Дирк. Если вы хотите простоту tic/toc, то вы можете сделать это и в R.

EDIT: я уничтожил функцию сбора мусора из пакета MATLAB, а tic теперь позволяет вам выбирать, интересуетесь ли вы полным временем или просто временем пользователя.

tic <- function(gcFirst = TRUE, type=c("elapsed", "user.self", "sys.self"))
{
   type <- match.arg(type)
   assign(".type", type, envir=baseenv())
   if(gcFirst) gc(FALSE)
   tic <- proc.time()[type]         
   assign(".tic", tic, envir=baseenv())
   invisible(tic)
}

toc <- function()
{
   type <- get(".type", envir=baseenv())
   toc <- proc.time()[type]
   tic <- get(".tic", envir=baseenv())
   print(toc - tic)
   invisible(toc)
}

Использование, например, tic(); invisible(qr(matrix(runif(1e6), nrow=1e3))); toc()

Ответ 2

В CRAN имеется пакет эмуляции MATLAB matlab. Он имеет реализации tic и toc (но они очень похожи на функции в ответе Ричи Коттона, вместо "user.self" в proc.time() используется "истек" )

> tic
function (gcFirst = FALSE) 
{
    if (gcFirst == TRUE) {
        gc(verbose = FALSE)
    }
    assign("savedTime", proc.time()[3], envir = .MatlabNamespaceEnv)
    invisible()
}
<environment: namespace:matlab>
> toc
function (echo = TRUE) 
{
    prevTime <- get("savedTime", envir = .MatlabNamespaceEnv)
    diffTimeSecs <- proc.time()[3] - prevTime
    if (echo) {
        cat(sprintf("elapsed time is %f seconds", diffTimeSecs), 
            "\n")
        return(invisible())
    }
    else {
        return(diffTimeSecs)
    }
}
<environment: namespace:matlab>

Ответ 3

Прямых эквивалентов tic и toc не существует.

См. help(system.time), а также руководство R Extensions о профилировании. Обсуждения профилирующих и профилирующих инструментов также находятся в слайдах "Intro to HPC with R", на которые ссылаются высокопроизводительные вычисления с задачами R

Ответ 4

Очень простая эквивалентность с tic и toc, которую вы могли бы иметь:

tic=proc.time()[3]

...code...

toc=proc.time()[3] - tic

Где [3], потому что нас интересует третий элемент в векторе, возвращаемом proc.time(), истекшее время.

Ответ 5

Существует относительно новый пакет tictoc, который реплицирует функции точно так же, как вы использовали бы их в Matlab.

http://cran.r-project.org/web/packages/tictoc/index.html

## Basic use case
tic()
print("Do something...")
Sys.sleep(1)
toc()
# 1.034 sec elapsed

Ответ 6

Подход к закрытию

Очень простой и простой способ сделать это - использовать закрытие (что означает наличие функции внутри функции):

tic <- function () { 
    now <- proc.time()
    function () { 
        proc.time() - now 
    }
}

Вы запускаете таймер следующим образом:

toc <- tic()

И затем вы получите время назад следующим образом:

toc()

Какой выдает именованный вектор, который печатается следующим образом:

 user  system elapsed 
0.008   0.004   2.055 

Даже с простотой этой версии вы также получаете всю функциональность версий Matlab и Richie Cotton, а также добавленную возможность запуска нескольких таймеров:

toc1 <- tic()
toc2 <- tic()

Ответ 7

На дату 2015-03-25, и, возможно, раньше, pracma пакет содержит функции tic() и toc().

Пример:

> library(pracma)
> tic()
> for(i in 1:10000) mad(runif(10000))    # kill time
> toc()
elapsed time is 18.610000 seconds 

Ответ 8

Нет, но вот однострочное решение.

time.it<-function(f) { a<-proc.time(); out<-f(); print(proc.time()-a); out }

И пример использования:

result<-time.it(function(){ A<-matrix(runif(5000^2),nrow=5000); b<-runif(5000); solve(A,b) } )
user  system elapsed 
12.788  12.268   8.623 

В противном случае microbenchmark является моим любимым в плане пакетов.

Ответ 9

Просто для полноты: вы действительно можете "имитировать" tic и toc в R, чтобы вы могли писать

tic
## do something
toc

без круглых скобок. Трюк состоит в том, чтобы злоупотреблять print функция, как показано в Fun: tic и toc в R:

tic <- 1
class(tic) <- "tic"

toc <- 1
class(toc) <- "toc"

print.tic <- function(x, ...) {
    if (!exists("proc.time"))
        stop("cannot measure time")
    gc(FALSE)
    assign(".temp.tictime", proc.time(), envir = .GlobalEnv)
}

print.toc <- function(x,...) {
    if (!exists(".temp.tictime", envir = .GlobalEnv))
        stop("did you tic?")
    time <- get(".temp.tictime", envir = .GlobalEnv)
    rm(".temp.tictime", envir = .GlobalEnv)
    print(res <- structure(proc.time() - time,
                           class = "proc_time"), ...)
    invisible(res)
}

Итак, набрав

tic
Sys.sleep(2)
toc

должно получиться примерно так:

   user  system elapsed 
  0.000   0.000   2.002 

Как я уже сказал, это трюк; system.time, Rprof и пакеты, такие как rbenchmark, являются способом измерения время вычисления в R.

Ответ 10

install.packages("tictoc")
library(tictoc)
# Timing nested code. 
# The string provided in the call to tic() becomes a prefix to the output of toc()
tic("outer")
    Sys.sleep(1)
    tic("middle")
        Sys.sleep(2)
        tic("inner")
            Sys.sleep(3)
        toc() # inner
# inner: 3.004 sec elapsed
    toc() # middle
# middle: 5.008 sec elapsed
toc() # outer
# outer: 6.016 sec elapsed

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