cMinor - 1 year ago 116

R Question

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 Source

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.