R中的秒表功能

时间:2009-11-11 15:39:28

标签: matlab r

是否有类似于MATLAB tic/toc的R计时器或秒表功能?

10 个答案:

答案 0 :(得分:37)

正如Dirk所提到的,R中有很多分析工具。如果你想要简单的tic / toc,那么你也可以在R中做到。

编辑:我已经从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()

答案 1 :(得分:14)

CRAN上有一个MATLAB仿真包 matlab 。它具有tictoc的实现(但它们与Richie Cottons答案中的函数非常相似;在proc.time()中使用“elapsed”代替“user.self”)

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

答案 2 :(得分:8)

不存在tic和toc的直接等价物。

请参阅help(system.time)以及有关分析的R Extensions手册。关于性能分析和分析工具的讨论也在High Performance Computing with R taskview

上引用的“HPC with R简介”幻灯片中进行了讨论

答案 3 :(得分:8)

你可以拥有与tic和toc非常简单的等价:

tic=proc.time()[3]

...code...

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

其中[3]是因为我们对proc.time()返回的向量中的第三个元素感兴趣,这是经过的时间。

答案 4 :(得分:4)

有一个相对较新的包tictoc,它可以像在Matlab中一样复制这些功能。

&#xA;&#xA;

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

&#xA;&#xA;
  ##基本用例&#xA; tic()&#xA; print(“做某事......”)&#xA; Sys.sleep(1)& #xA; toc()&#xA;#1.034秒过去&#xA;  
&#xA;

答案 5 :(得分:4)

关闭方法

一个非常简洁的方法是使用一个闭包(这意味着在一个函数中有一个函数):

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

答案 6 :(得分:2)

截至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 

答案 7 :(得分:2)

不,但这是一个单行解决方案。

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在包装方面是我最喜欢的。

答案 8 :(得分:0)

为了完整性:你实际上可以'模拟'抽动 和t中的toc,以便你可以写

tic
## do something
toc

没有括号。诀窍是滥用print 函数,如Fun: tic and toc in 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.timeRprof和 诸如rbenchmark之类的包是衡量标准的方法 计算时间在R。

答案 9 :(得分:0)

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包实现了之前答案所描述的功能 - 感谢您的灵感!该软件包还添加了嵌套计时,收集用户定义变量,自定义消息和回调中的计时。