system.time()
returns CPU (and other) times that expr used.
x <- rep(NA,10000)
system.time(for(i in 1:10000) x[i] <- mean(runif(1000)))
## user system elapsed
## 0.56 0.00 0.56
system.time(sort(x))
## user system elapsed
## 0 0 0
microbenchmark
serves as a more accurate replacement of the often seen system.time(replicate(1000, expr)) expression. It tries hard to accurately measure only the time it takes to evaluate expr. To achieved this, the sub-millisecond (supposedly nanosecond) accurate timing functions most modern operating systems provide are used. Additionally all evaluations of the expressions are done in C code to minimze any overhead.
library(microbenchmark)
m <- microbenchmark(
xs <- 1:1000,
for(i in 1:1000) {xs[i] <- i},
xs <- rnorm(1000),
times = 250
)
m
## Unit: nanoseconds
## expr min lq mean median
## xs <- 1:1000 0 855 1254.432 856
## for (i in 1:1000) { xs[i] <- i } 1172132 1230289 1342391.128 1264927
## xs <- rnorm(1000) 83388 85954 93707.820 89375
## uq max neval
## 1284 17533 250
## 1323940 3895700 250
## 94935 244604 250
library(ggplot2)
qplot(y=time, data=m, colour=expr) + scale_y_log10()
The library consists of just one function, benchmark, which is a simple wrapper around system.time
.
Given a specification of the benchmarking process (counts of replications, evaluation environment) and an arbitrary number of expressions, benchmark()
evaluates each of the expressions in the specified environment, replicating the evaluation as many times as specified, and returning the results conveniently wrapped into a data frame.
library(rbenchmark)
random.array = function(rows, cols, dist=rnorm)
array(dist(rows*cols), c(rows, cols))
random.replicate = function(rows, cols, dist=rnorm)
replicate(cols, dist(rows))
results <-
benchmark(random.array(100, 100),
random.replicate(100, 100),
columns=c('test', 'elapsed', 'replications'),
replications=c(20,40),
order="elapsed")
results[results$test == "random.array(100, 100)",]
## test elapsed replications
## 1 random.array(100, 100) 0.03 20
## 3 random.array(100, 100) 0.04 40
results[results$test == "random.replicate(100, 100)",]
## test elapsed replications
## 2 random.replicate(100, 100) 0.04 20
## 4 random.replicate(100, 100) 0.05 40