cMinor cMinor - 3 months ago 13
R Question

get execution time in milliseconds in R

I have read a solution to this using

tic(), toc() functions


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();
-----code----
toc();


elapsed
0.15


But I would like to get a lot of precision in milliseconds?

Also I was using this

ptm <- proc.time()
---code
proc.time() - ptm


and get this

user system elapsed
1.55 0.25 1.84


How to get more decimals or more precision?

Answer

1) Timing is operating-system dependent. On Windows you may only get milliseconds. From ?proc.time:

The resolution of the times will be system-specific and on Unix-alikes times are rounded down to milliseconds. On modern systems they will be that accurate, but on older systems they might be accurate to 1/100 or 1/60 sec. They are typically available to 10ms on Windows.

2) No need to define tic() and toc(), R has system.time(). Here is an example:

system.time(replicate(100, sqrt(seq(1.0, 1.0e6))))
# user  system elapsed 
# 2.210   0.650   2.867 

3) There are excellent add-on packages rbenchmark and microbenchmark.

3.1) rbenchmark is particularly useful for comparison of commands, but can also be used directly:

library(rbenchmark)
x <- seq(1.0, 1.0e6); benchmark(sqrt(x), log(x))
# test replications elapsed relative user.self sys.self user.child sys.child
# 2  log(x)          100   5.408  2.85835      5.21     0.19          0         0
# 1 sqrt(x)          100   1.892  1.00000      1.62     0.26          0         0

3.2) microbenchmark excels at highest precision measurements:

library(microbenchmark)
x <- seq(1.0, 1.0e6); microbenchmark(sqrt(x), log(x))
# Unit: nanoseconds
#      expr      min       lq   median       uq      max
# 1  log(x) 50589289 50703132 55283301 55353594 55917216
# 2 sqrt(x) 15309426 15412135 15452990 20011418 39551819

and this last one, particularly on Linux, already gives you nano-seconds. It can also plot results etc so have a closer look at that package.