colOrderStats() and rowOrderStats() benchmarks on subsetted computation
This report benchmark the performance of colOrderStats() and rowOrderStats() on subsetted computation.
Data type “integer”
Data
> rmatrix <- function(nrow, ncol, mode = c("logical", "double", "integer", "index"), range = c(-100,
+ +100), na_prob = 0) {
+ mode <- match.arg(mode)
+ n <- nrow * ncol
+ if (mode == "logical") {
+ x <- sample(c(FALSE, TRUE), size = n, replace = TRUE)
+ } else if (mode == "index") {
+ x <- seq_len(n)
+ mode <- "integer"
+ } else {
+ x <- runif(n, min = range[1], max = range[2])
+ }
+ storage.mode(x) <- mode
+ if (na_prob > 0)
+ x[sample(n, size = na_prob * n)] <- NA
+ dim(x) <- c(nrow, ncol)
+ x
+ }
> rmatrices <- function(scale = 10, seed = 1, ...) {
+ set.seed(seed)
+ data <- list()
+ data[[1]] <- rmatrix(nrow = scale * 1, ncol = scale * 1, ...)
+ data[[2]] <- rmatrix(nrow = scale * 10, ncol = scale * 10, ...)
+ data[[3]] <- rmatrix(nrow = scale * 100, ncol = scale * 1, ...)
+ data[[4]] <- t(data[[3]])
+ data[[5]] <- rmatrix(nrow = scale * 10, ncol = scale * 100, ...)
+ data[[6]] <- t(data[[5]])
+ names(data) <- sapply(data, FUN = function(x) paste(dim(x), collapse = "x"))
+ data
+ }
> data <- rmatrices(mode = mode)
Results
10x10 integer matrix
> X <- data[["10x10"]]
> rows <- sample.int(nrow(X), size = nrow(X) * 0.7)
> cols <- sample.int(ncol(X), size = ncol(X) * 0.7)
> X_S <- X[rows, cols]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5263975 281.2 8529671 455.6 8529671 455.6
Vcells 10236773 78.2 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats_X_S = colOrderStats(X_S, which = which, na.rm = FALSE),
+ `colOrderStats(X, rows, cols)` = colOrderStats(X, rows = rows, cols = cols, which = which, na.rm = FALSE),
+ `colOrderStats(X[rows, cols])` = colOrderStats(X[rows, cols], which = which, na.rm = FALSE),
+ unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5255029 280.7 8529671 455.6 8529671 455.6
Vcells 10207528 77.9 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats_X_S = rowOrderStats(X_S, which = which, na.rm = FALSE),
+ `rowOrderStats(X, cols, rows)` = rowOrderStats(X, rows = cols, cols = rows, which = which, na.rm = FALSE),
+ `rowOrderStats(X[cols, rows])` = rowOrderStats(X[cols, rows], which = which, na.rm = FALSE),
+ unit = "ms")
Table: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on integer+10x10 data. The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
0.003129 |
0.0032170 |
0.0047680 |
0.0032730 |
0.0033700 |
0.132718 |
2 |
colOrderStats(X, rows, cols) |
0.003543 |
0.0036650 |
0.0039469 |
0.0037210 |
0.0038385 |
0.011956 |
3 |
colOrderStats(X[rows, cols]) |
0.003902 |
0.0042565 |
0.0045577 |
0.0043655 |
0.0044990 |
0.011916 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
1.000000 |
1.000000 |
1.0000000 |
1.000000 |
1.000000 |
1.0000000 |
2 |
colOrderStats(X, rows, cols) |
1.132311 |
1.139260 |
0.8277814 |
1.136877 |
1.139021 |
0.0900857 |
3 |
colOrderStats(X[rows, cols]) |
1.247044 |
1.323127 |
0.9558915 |
1.333792 |
1.335015 |
0.0897844 |
Table: Benchmarking of rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on integer+10x10 data (transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
0.003206 |
0.0032975 |
0.0034111 |
0.0033395 |
0.0034290 |
0.006321 |
2 |
rowOrderStats(X, cols, rows) |
0.003675 |
0.0038090 |
0.0050754 |
0.0038685 |
0.0039845 |
0.117801 |
3 |
rowOrderStats(X[cols, rows]) |
0.004097 |
0.0043385 |
0.0045615 |
0.0044550 |
0.0046565 |
0.007595 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.00000 |
2 |
rowOrderStats(X, cols, rows) |
1.146288 |
1.155118 |
1.487933 |
1.158407 |
1.162001 |
18.63645 |
3 |
rowOrderStats(X[cols, rows]) |
1.277916 |
1.315694 |
1.337276 |
1.334032 |
1.357976 |
1.20155 |
Figure: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on integer+10x10 data as well as rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on integer+10x10 data (original and transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
3.129 |
3.2170 |
4.76801 |
3.2730 |
3.370 |
132.718 |
2 |
rowOrderStats_X_S |
3.206 |
3.2975 |
3.41106 |
3.3395 |
3.429 |
6.321 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
1.000000 |
1.000000 |
1.0000000 |
1.000000 |
1.000000 |
1.0000000 |
2 |
rowOrderStats_X_S |
1.024609 |
1.025023 |
0.7154054 |
1.020318 |
1.017507 |
0.0476273 |
Figure: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on integer+10x10 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

100x100 integer matrix
> X <- data[["100x100"]]
> rows <- sample.int(nrow(X), size = nrow(X) * 0.7)
> cols <- sample.int(ncol(X), size = ncol(X) * 0.7)
> X_S <- X[rows, cols]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5253692 280.6 8529671 455.6 8529671 455.6
Vcells 9875894 75.4 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats_X_S = colOrderStats(X_S, which = which, na.rm = FALSE),
+ `colOrderStats(X, rows, cols)` = colOrderStats(X, rows = rows, cols = cols, which = which, na.rm = FALSE),
+ `colOrderStats(X[rows, cols])` = colOrderStats(X[rows, cols], which = which, na.rm = FALSE),
+ unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5253667 280.6 8529671 455.6 8529671 455.6
Vcells 9880946 75.4 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats_X_S = rowOrderStats(X_S, which = which, na.rm = FALSE),
+ `rowOrderStats(X, cols, rows)` = rowOrderStats(X, rows = cols, cols = rows, which = which, na.rm = FALSE),
+ `rowOrderStats(X[cols, rows])` = rowOrderStats(X[cols, rows], which = which, na.rm = FALSE),
+ unit = "ms")
Table: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on integer+100x100 data. The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
0.066108 |
0.0707340 |
0.0770688 |
0.0750445 |
0.0815830 |
0.096272 |
2 |
colOrderStats(X, rows, cols) |
0.074029 |
0.0783500 |
0.0851521 |
0.0832290 |
0.0903345 |
0.110941 |
3 |
colOrderStats(X[rows, cols]) |
0.077098 |
0.0809025 |
0.0895003 |
0.0860835 |
0.0970160 |
0.149868 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
colOrderStats(X, rows, cols) |
1.119819 |
1.107671 |
1.104883 |
1.109062 |
1.107271 |
1.152370 |
3 |
colOrderStats(X[rows, cols]) |
1.166243 |
1.143757 |
1.161303 |
1.147099 |
1.189169 |
1.556714 |
Table: Benchmarking of rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on integer+100x100 data (transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
0.064871 |
0.0686835 |
0.0752604 |
0.0740360 |
0.0805175 |
0.101112 |
2 |
rowOrderStats(X, cols, rows) |
0.073535 |
0.0769715 |
0.0844522 |
0.0827860 |
0.0887010 |
0.131338 |
3 |
rowOrderStats(X[cols, rows]) |
0.075465 |
0.0795395 |
0.0861517 |
0.0855185 |
0.0912645 |
0.112330 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
rowOrderStats(X, cols, rows) |
1.133557 |
1.120669 |
1.122133 |
1.118186 |
1.101636 |
1.298936 |
3 |
rowOrderStats(X[cols, rows]) |
1.163309 |
1.158058 |
1.144714 |
1.155093 |
1.133474 |
1.110946 |
Figure: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on integer+100x100 data as well as rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on integer+100x100 data (original and transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
64.871 |
68.6835 |
75.26044 |
74.0360 |
80.5175 |
101.112 |
1 |
colOrderStats_X_S |
66.108 |
70.7340 |
77.06882 |
75.0445 |
81.5830 |
96.272 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.0000000 |
1 |
colOrderStats_X_S |
1.019069 |
1.029854 |
1.024028 |
1.013622 |
1.013233 |
0.9521323 |
Figure: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on integer+100x100 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

1000x10 integer matrix
> X <- data[["1000x10"]]
> rows <- sample.int(nrow(X), size = nrow(X) * 0.7)
> cols <- sample.int(ncol(X), size = ncol(X) * 0.7)
> X_S <- X[rows, cols]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5254436 280.7 8529671 455.6 8529671 455.6
Vcells 9880250 75.4 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats_X_S = colOrderStats(X_S, which = which, na.rm = FALSE),
+ `colOrderStats(X, rows, cols)` = colOrderStats(X, rows = rows, cols = cols, which = which, na.rm = FALSE),
+ `colOrderStats(X[rows, cols])` = colOrderStats(X[rows, cols], which = which, na.rm = FALSE),
+ unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5254411 280.7 8529671 455.6 8529671 455.6
Vcells 9885302 75.5 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats_X_S = rowOrderStats(X_S, which = which, na.rm = FALSE),
+ `rowOrderStats(X, cols, rows)` = rowOrderStats(X, rows = cols, cols = rows, which = which, na.rm = FALSE),
+ `rowOrderStats(X[cols, rows])` = rowOrderStats(X[cols, rows], which = which, na.rm = FALSE),
+ unit = "ms")
Table: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on integer+1000x10 data. The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
0.061762 |
0.0660685 |
0.0717479 |
0.0706405 |
0.0766410 |
0.094011 |
2 |
colOrderStats(X, rows, cols) |
0.069930 |
0.0733140 |
0.0799615 |
0.0772010 |
0.0862880 |
0.106527 |
3 |
colOrderStats(X[rows, cols]) |
0.071619 |
0.0745230 |
0.0820215 |
0.0791005 |
0.0889015 |
0.145445 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
colOrderStats(X, rows, cols) |
1.132250 |
1.109666 |
1.114479 |
1.092872 |
1.125873 |
1.133133 |
3 |
colOrderStats(X[rows, cols]) |
1.159596 |
1.127966 |
1.143190 |
1.119761 |
1.159973 |
1.547106 |
Table: Benchmarking of rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on integer+1000x10 data (transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
0.059928 |
0.0631835 |
0.0686435 |
0.0657405 |
0.0739390 |
0.094360 |
2 |
rowOrderStats(X, cols, rows) |
0.069760 |
0.0736135 |
0.0809133 |
0.0793145 |
0.0871755 |
0.103094 |
3 |
rowOrderStats(X[cols, rows]) |
0.070572 |
0.0746240 |
0.0821556 |
0.0803925 |
0.0874665 |
0.148321 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
rowOrderStats(X, cols, rows) |
1.164063 |
1.165075 |
1.178746 |
1.206479 |
1.179019 |
1.092560 |
3 |
rowOrderStats(X[cols, rows]) |
1.177613 |
1.181068 |
1.196844 |
1.222876 |
1.182955 |
1.571863 |
Figure: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on integer+1000x10 data as well as rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on integer+1000x10 data (original and transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
59.928 |
63.1835 |
68.64352 |
65.7405 |
73.939 |
94.360 |
1 |
colOrderStats_X_S |
61.762 |
66.0685 |
71.74789 |
70.6405 |
76.641 |
94.011 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.0000000 |
1 |
colOrderStats_X_S |
1.030603 |
1.045661 |
1.045225 |
1.074536 |
1.036544 |
0.9963014 |
Figure: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on integer+1000x10 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

10x1000 integer matrix
> X <- data[["10x1000"]]
> rows <- sample.int(nrow(X), size = nrow(X) * 0.7)
> cols <- sample.int(ncol(X), size = ncol(X) * 0.7)
> X_S <- X[rows, cols]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5254640 280.7 8529671 455.6 8529671 455.6
Vcells 9881190 75.4 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats_X_S = colOrderStats(X_S, which = which, na.rm = FALSE),
+ `colOrderStats(X, rows, cols)` = colOrderStats(X, rows = rows, cols = cols, which = which, na.rm = FALSE),
+ `colOrderStats(X[rows, cols])` = colOrderStats(X[rows, cols], which = which, na.rm = FALSE),
+ unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5254615 280.7 8529671 455.6 8529671 455.6
Vcells 9886242 75.5 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats_X_S = rowOrderStats(X_S, which = which, na.rm = FALSE),
+ `rowOrderStats(X, cols, rows)` = rowOrderStats(X, rows = cols, cols = rows, which = which, na.rm = FALSE),
+ `rowOrderStats(X[cols, rows])` = rowOrderStats(X[cols, rows], which = which, na.rm = FALSE),
+ unit = "ms")
Table: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on integer+10x1000 data. The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
0.059233 |
0.0647800 |
0.0707883 |
0.0691295 |
0.0750850 |
0.120453 |
2 |
colOrderStats(X, rows, cols) |
0.067620 |
0.0717445 |
0.0776411 |
0.0755180 |
0.0834125 |
0.101483 |
3 |
colOrderStats(X[rows, cols]) |
0.070892 |
0.0775805 |
0.0831609 |
0.0825245 |
0.0884600 |
0.110625 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
1.000000 |
1.00000 |
1.000000 |
1.000000 |
1.000000 |
1.0000000 |
2 |
colOrderStats(X, rows, cols) |
1.141593 |
1.10751 |
1.096807 |
1.092413 |
1.110908 |
0.8425112 |
3 |
colOrderStats(X[rows, cols]) |
1.196833 |
1.19760 |
1.174783 |
1.193767 |
1.178132 |
0.9184080 |
Table: Benchmarking of rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on integer+10x1000 data (transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
0.057303 |
0.0618215 |
0.0677530 |
0.0667540 |
0.072352 |
0.092838 |
2 |
rowOrderStats(X, cols, rows) |
0.061081 |
0.0705800 |
0.0758625 |
0.0737585 |
0.080763 |
0.126372 |
3 |
rowOrderStats(X[cols, rows]) |
0.066314 |
0.0729140 |
0.0797251 |
0.0788650 |
0.085175 |
0.107101 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
rowOrderStats(X, cols, rows) |
1.065930 |
1.141674 |
1.119691 |
1.104930 |
1.116251 |
1.361210 |
3 |
rowOrderStats(X[cols, rows]) |
1.157252 |
1.179428 |
1.176701 |
1.181427 |
1.177231 |
1.153633 |
Figure: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on integer+10x1000 data as well as rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on integer+10x1000 data (original and transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
57.303 |
61.8215 |
67.75303 |
66.7540 |
72.352 |
92.838 |
1 |
colOrderStats_X_S |
59.233 |
64.7800 |
70.78832 |
69.1295 |
75.085 |
120.453 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1 |
colOrderStats_X_S |
1.033681 |
1.047856 |
1.044799 |
1.035586 |
1.037774 |
1.297454 |
Figure: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on integer+10x1000 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

100x1000 integer matrix
> X <- data[["100x1000"]]
> rows <- sample.int(nrow(X), size = nrow(X) * 0.7)
> cols <- sample.int(ncol(X), size = ncol(X) * 0.7)
> X_S <- X[rows, cols]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5254853 280.7 8529671 455.6 8529671 455.6
Vcells 9903940 75.6 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats_X_S = colOrderStats(X_S, which = which, na.rm = FALSE),
+ `colOrderStats(X, rows, cols)` = colOrderStats(X, rows = rows, cols = cols, which = which, na.rm = FALSE),
+ `colOrderStats(X[rows, cols])` = colOrderStats(X[rows, cols], which = which, na.rm = FALSE),
+ unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5254828 280.7 8529671 455.6 8529671 455.6
Vcells 9953992 76.0 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats_X_S = rowOrderStats(X_S, which = which, na.rm = FALSE),
+ `rowOrderStats(X, cols, rows)` = rowOrderStats(X, rows = cols, cols = rows, which = which, na.rm = FALSE),
+ `rowOrderStats(X[cols, rows])` = rowOrderStats(X[cols, rows], which = which, na.rm = FALSE),
+ unit = "ms")
Table: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on integer+100x1000 data. The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
0.609150 |
0.636613 |
0.6787558 |
0.6551865 |
0.6872975 |
1.036877 |
2 |
colOrderStats(X, rows, cols) |
0.651951 |
0.681208 |
0.7173971 |
0.7046010 |
0.7290600 |
1.086975 |
3 |
colOrderStats(X[rows, cols]) |
0.676854 |
0.690296 |
0.7556894 |
0.7338745 |
0.7620855 |
1.069102 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.00000 |
1.000000 |
1.000000 |
2 |
colOrderStats(X, rows, cols) |
1.070264 |
1.070050 |
1.056930 |
1.07542 |
1.060763 |
1.048316 |
3 |
colOrderStats(X[rows, cols]) |
1.111145 |
1.084326 |
1.113345 |
1.12010 |
1.108815 |
1.031079 |
Table: Benchmarking of rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on integer+100x1000 data (transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
0.600200 |
0.6044345 |
0.6665140 |
0.6365715 |
0.6602375 |
1.011850 |
2 |
rowOrderStats(X, cols, rows) |
0.657676 |
0.6873090 |
0.7158833 |
0.7108225 |
0.7160060 |
1.092446 |
3 |
rowOrderStats(X[cols, rows]) |
0.664402 |
0.6847415 |
0.7365434 |
0.7166075 |
0.7361890 |
1.080415 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
rowOrderStats(X, cols, rows) |
1.095761 |
1.137111 |
1.074071 |
1.116642 |
1.084467 |
1.079652 |
3 |
rowOrderStats(X[cols, rows]) |
1.106968 |
1.132863 |
1.105068 |
1.125730 |
1.115037 |
1.067762 |
Figure: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on integer+100x1000 data as well as rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on integer+100x1000 data (original and transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
600.20 |
604.4345 |
666.5140 |
636.5715 |
660.2375 |
1011.850 |
1 |
colOrderStats_X_S |
609.15 |
636.6130 |
678.7558 |
655.1865 |
687.2975 |
1036.877 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1 |
colOrderStats_X_S |
1.014912 |
1.053237 |
1.018367 |
1.029243 |
1.040985 |
1.024734 |
Figure: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on integer+100x1000 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

1000x100 integer matrix
> X <- data[["1000x100"]]
> rows <- sample.int(nrow(X), size = nrow(X) * 0.7)
> cols <- sample.int(ncol(X), size = ncol(X) * 0.7)
> X_S <- X[rows, cols]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5255063 280.7 8529671 455.6 8529671 455.6
Vcells 9904718 75.6 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats_X_S = colOrderStats(X_S, which = which, na.rm = FALSE),
+ `colOrderStats(X, rows, cols)` = colOrderStats(X, rows = rows, cols = cols, which = which, na.rm = FALSE),
+ `colOrderStats(X[rows, cols])` = colOrderStats(X[rows, cols], which = which, na.rm = FALSE),
+ unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5255038 280.7 8529671 455.6 8529671 455.6
Vcells 9954770 76.0 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats_X_S = rowOrderStats(X_S, which = which, na.rm = FALSE),
+ `rowOrderStats(X, cols, rows)` = rowOrderStats(X, rows = cols, cols = rows, which = which, na.rm = FALSE),
+ `rowOrderStats(X[cols, rows])` = rowOrderStats(X[cols, rows], which = which, na.rm = FALSE),
+ unit = "ms")
Table: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on integer+1000x100 data. The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
0.552532 |
0.5836405 |
0.6159517 |
0.599914 |
0.6071355 |
0.924861 |
2 |
colOrderStats(X, rows, cols) |
0.595249 |
0.6134970 |
0.6669110 |
0.646752 |
0.6602835 |
0.986095 |
3 |
colOrderStats(X[rows, cols]) |
0.616151 |
0.6388200 |
0.6797717 |
0.667968 |
0.6744430 |
1.059114 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
colOrderStats(X, rows, cols) |
1.077311 |
1.051156 |
1.082733 |
1.078075 |
1.087539 |
1.066209 |
3 |
colOrderStats(X[rows, cols]) |
1.115141 |
1.094544 |
1.103612 |
1.113440 |
1.110861 |
1.145160 |
Table: Benchmarking of rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on integer+1000x100 data (transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
0.545425 |
0.5756490 |
0.6048663 |
0.5925385 |
0.595024 |
0.865512 |
2 |
rowOrderStats(X, cols, rows) |
0.604079 |
0.6208395 |
0.6651296 |
0.6559925 |
0.658834 |
1.029439 |
3 |
rowOrderStats(X[cols, rows]) |
0.612949 |
0.6477925 |
0.6813698 |
0.6674090 |
0.674064 |
1.007780 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
rowOrderStats(X, cols, rows) |
1.107538 |
1.078504 |
1.099631 |
1.107088 |
1.107239 |
1.189399 |
3 |
rowOrderStats(X[cols, rows]) |
1.123801 |
1.125325 |
1.126480 |
1.126356 |
1.132835 |
1.164374 |
Figure: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on integer+1000x100 data as well as rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on integer+1000x100 data (original and transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
545.425 |
575.6490 |
604.8663 |
592.5385 |
595.0240 |
865.512 |
1 |
colOrderStats_X_S |
552.532 |
583.6405 |
615.9517 |
599.9140 |
607.1355 |
924.861 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
1.00000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1 |
colOrderStats_X_S |
1.01303 |
1.013883 |
1.018327 |
1.012447 |
1.020355 |
1.068571 |
Figure: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on integer+1000x100 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

Data type “double”
Data
> rmatrix <- function(nrow, ncol, mode = c("logical", "double", "integer", "index"), range = c(-100,
+ +100), na_prob = 0) {
+ mode <- match.arg(mode)
+ n <- nrow * ncol
+ if (mode == "logical") {
+ x <- sample(c(FALSE, TRUE), size = n, replace = TRUE)
+ } else if (mode == "index") {
+ x <- seq_len(n)
+ mode <- "integer"
+ } else {
+ x <- runif(n, min = range[1], max = range[2])
+ }
+ storage.mode(x) <- mode
+ if (na_prob > 0)
+ x[sample(n, size = na_prob * n)] <- NA
+ dim(x) <- c(nrow, ncol)
+ x
+ }
> rmatrices <- function(scale = 10, seed = 1, ...) {
+ set.seed(seed)
+ data <- list()
+ data[[1]] <- rmatrix(nrow = scale * 1, ncol = scale * 1, ...)
+ data[[2]] <- rmatrix(nrow = scale * 10, ncol = scale * 10, ...)
+ data[[3]] <- rmatrix(nrow = scale * 100, ncol = scale * 1, ...)
+ data[[4]] <- t(data[[3]])
+ data[[5]] <- rmatrix(nrow = scale * 10, ncol = scale * 100, ...)
+ data[[6]] <- t(data[[5]])
+ names(data) <- sapply(data, FUN = function(x) paste(dim(x), collapse = "x"))
+ data
+ }
> data <- rmatrices(mode = mode)
Results
10x10 double matrix
> X <- data[["10x10"]]
> rows <- sample.int(nrow(X), size = nrow(X) * 0.7)
> cols <- sample.int(ncol(X), size = ncol(X) * 0.7)
> X_S <- X[rows, cols]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5255281 280.7 8529671 455.6 8529671 455.6
Vcells 9995847 76.3 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats_X_S = colOrderStats(X_S, which = which, na.rm = FALSE),
+ `colOrderStats(X, rows, cols)` = colOrderStats(X, rows = rows, cols = cols, which = which, na.rm = FALSE),
+ `colOrderStats(X[rows, cols])` = colOrderStats(X[rows, cols], which = which, na.rm = FALSE),
+ unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5255247 280.7 8529671 455.6 8529671 455.6
Vcells 9995984 76.3 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats_X_S = rowOrderStats(X_S, which = which, na.rm = FALSE),
+ `rowOrderStats(X, cols, rows)` = rowOrderStats(X, rows = cols, cols = rows, which = which, na.rm = FALSE),
+ `rowOrderStats(X[cols, rows])` = rowOrderStats(X[cols, rows], which = which, na.rm = FALSE),
+ unit = "ms")
Table: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on double+10x10 data. The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
0.003474 |
0.0035820 |
0.0039555 |
0.0036640 |
0.0037865 |
0.027975 |
2 |
colOrderStats(X, rows, cols) |
0.003876 |
0.0040705 |
0.0042245 |
0.0041505 |
0.0042980 |
0.007222 |
3 |
colOrderStats(X[rows, cols]) |
0.004462 |
0.0046795 |
0.0048965 |
0.0047725 |
0.0049425 |
0.010880 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.0000000 |
2 |
colOrderStats(X, rows, cols) |
1.115717 |
1.136376 |
1.068009 |
1.132778 |
1.135085 |
0.2581591 |
3 |
colOrderStats(X[rows, cols]) |
1.284398 |
1.306393 |
1.237886 |
1.302538 |
1.305295 |
0.3889187 |
Table: Benchmarking of rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on double+10x10 data (transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
0.003207 |
0.0033640 |
0.0034941 |
0.0034100 |
0.0035485 |
0.006855 |
2 |
rowOrderStats(X, cols, rows) |
0.003672 |
0.0038470 |
0.0043309 |
0.0039245 |
0.0040450 |
0.038752 |
3 |
rowOrderStats(X[cols, rows]) |
0.004214 |
0.0044175 |
0.0047575 |
0.0045085 |
0.0046585 |
0.018309 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
rowOrderStats(X, cols, rows) |
1.144995 |
1.143579 |
1.239489 |
1.150880 |
1.139918 |
5.653100 |
3 |
rowOrderStats(X[cols, rows]) |
1.314001 |
1.313169 |
1.361601 |
1.322141 |
1.312808 |
2.670897 |
Figure: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on double+10x10 data as well as rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on double+10x10 data (original and transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
3.207 |
3.364 |
3.49407 |
3.410 |
3.5485 |
6.855 |
1 |
colOrderStats_X_S |
3.474 |
3.582 |
3.95551 |
3.664 |
3.7865 |
27.975 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1 |
colOrderStats_X_S |
1.083255 |
1.064804 |
1.132064 |
1.074487 |
1.067071 |
4.080963 |
Figure: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on double+10x10 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

100x100 double matrix
> X <- data[["100x100"]]
> rows <- sample.int(nrow(X), size = nrow(X) * 0.7)
> cols <- sample.int(ncol(X), size = ncol(X) * 0.7)
> X_S <- X[rows, cols]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5255479 280.7 8529671 455.6 8529671 455.6
Vcells 10001788 76.4 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats_X_S = colOrderStats(X_S, which = which, na.rm = FALSE),
+ `colOrderStats(X, rows, cols)` = colOrderStats(X, rows = rows, cols = cols, which = which, na.rm = FALSE),
+ `colOrderStats(X[rows, cols])` = colOrderStats(X[rows, cols], which = which, na.rm = FALSE),
+ unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5255454 280.7 8529671 455.6 8529671 455.6
Vcells 10011840 76.4 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats_X_S = rowOrderStats(X_S, which = which, na.rm = FALSE),
+ `rowOrderStats(X, cols, rows)` = rowOrderStats(X, rows = cols, cols = rows, which = which, na.rm = FALSE),
+ `rowOrderStats(X[cols, rows])` = rowOrderStats(X[cols, rows], which = which, na.rm = FALSE),
+ unit = "ms")
Table: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on double+100x100 data. The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
0.101784 |
0.1066380 |
0.1167510 |
0.1114085 |
0.126964 |
0.146858 |
2 |
colOrderStats(X, rows, cols) |
0.108795 |
0.1129625 |
0.1218075 |
0.1166310 |
0.130235 |
0.159333 |
3 |
colOrderStats(X[rows, cols]) |
0.115087 |
0.1198455 |
0.1314851 |
0.1253960 |
0.139898 |
0.188071 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
colOrderStats(X, rows, cols) |
1.068881 |
1.059308 |
1.043311 |
1.046877 |
1.025763 |
1.084946 |
3 |
colOrderStats(X[rows, cols]) |
1.130698 |
1.123854 |
1.126202 |
1.125552 |
1.101871 |
1.280632 |
Table: Benchmarking of rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on double+100x100 data (transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
0.096792 |
0.103745 |
0.1134835 |
0.1080105 |
0.1238705 |
0.144627 |
2 |
rowOrderStats(X, cols, rows) |
0.102990 |
0.110213 |
0.1196191 |
0.1145410 |
0.1290140 |
0.173021 |
3 |
rowOrderStats(X[cols, rows]) |
0.109369 |
0.117146 |
0.1264956 |
0.1215265 |
0.1359545 |
0.156805 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
rowOrderStats(X, cols, rows) |
1.064034 |
1.062345 |
1.054065 |
1.060462 |
1.041523 |
1.196326 |
3 |
rowOrderStats(X[cols, rows]) |
1.129938 |
1.129172 |
1.114661 |
1.125136 |
1.097554 |
1.084203 |
Figure: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on double+100x100 data as well as rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on double+100x100 data (original and transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
96.792 |
103.745 |
113.4835 |
108.0105 |
123.8705 |
144.627 |
1 |
colOrderStats_X_S |
101.784 |
106.638 |
116.7510 |
111.4085 |
126.9640 |
146.858 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.00000 |
1.000000 |
1.000000 |
1 |
colOrderStats_X_S |
1.051575 |
1.027886 |
1.028792 |
1.03146 |
1.024974 |
1.015426 |
Figure: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on double+100x100 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

1000x10 double matrix
> X <- data[["1000x10"]]
> rows <- sample.int(nrow(X), size = nrow(X) * 0.7)
> cols <- sample.int(ncol(X), size = ncol(X) * 0.7)
> X_S <- X[rows, cols]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5255678 280.7 8529671 455.6 8529671 455.6
Vcells 10003288 76.4 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats_X_S = colOrderStats(X_S, which = which, na.rm = FALSE),
+ `colOrderStats(X, rows, cols)` = colOrderStats(X, rows = rows, cols = cols, which = which, na.rm = FALSE),
+ `colOrderStats(X[rows, cols])` = colOrderStats(X[rows, cols], which = which, na.rm = FALSE),
+ unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5255653 280.7 8529671 455.6 8529671 455.6
Vcells 10013340 76.4 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats_X_S = rowOrderStats(X_S, which = which, na.rm = FALSE),
+ `rowOrderStats(X, cols, rows)` = rowOrderStats(X, rows = cols, cols = rows, which = which, na.rm = FALSE),
+ `rowOrderStats(X[cols, rows])` = rowOrderStats(X[cols, rows], which = which, na.rm = FALSE),
+ unit = "ms")
Table: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on double+1000x10 data. The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
0.103595 |
0.1116145 |
0.1213058 |
0.1154855 |
0.1319685 |
0.156049 |
2 |
colOrderStats(X, rows, cols) |
0.109285 |
0.1198715 |
0.1283382 |
0.1239655 |
0.1372005 |
0.159964 |
3 |
colOrderStats(X[rows, cols]) |
0.113924 |
0.1202325 |
0.1328987 |
0.1286290 |
0.1430175 |
0.203368 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
colOrderStats(X, rows, cols) |
1.054925 |
1.073978 |
1.057972 |
1.073429 |
1.039646 |
1.025088 |
3 |
colOrderStats(X[rows, cols]) |
1.099706 |
1.077212 |
1.095567 |
1.113811 |
1.083724 |
1.303232 |
Table: Benchmarking of rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on double+1000x10 data (transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
0.096932 |
0.109479 |
0.1171596 |
0.1129365 |
0.118843 |
0.158255 |
2 |
rowOrderStats(X, cols, rows) |
0.107243 |
0.115201 |
0.1271652 |
0.1257950 |
0.135004 |
0.165558 |
3 |
rowOrderStats(X[cols, rows]) |
0.110565 |
0.120895 |
0.1333708 |
0.1319235 |
0.141502 |
0.208647 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
rowOrderStats(X, cols, rows) |
1.106373 |
1.052266 |
1.085401 |
1.113856 |
1.135986 |
1.046147 |
3 |
rowOrderStats(X[cols, rows]) |
1.140645 |
1.104276 |
1.138368 |
1.168121 |
1.190663 |
1.318423 |
Figure: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on double+1000x10 data as well as rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on double+1000x10 data (original and transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
96.932 |
109.4790 |
117.1596 |
112.9365 |
118.8430 |
158.255 |
1 |
colOrderStats_X_S |
103.595 |
111.6145 |
121.3059 |
115.4855 |
131.9685 |
156.049 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.00000 |
1.00000 |
1.000000 |
1.0000000 |
1 |
colOrderStats_X_S |
1.068739 |
1.019506 |
1.03539 |
1.02257 |
1.110444 |
0.9860605 |
Figure: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on double+1000x10 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

10x1000 double matrix
> X <- data[["10x1000"]]
> rows <- sample.int(nrow(X), size = nrow(X) * 0.7)
> cols <- sample.int(ncol(X), size = ncol(X) * 0.7)
> X_S <- X[rows, cols]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5255882 280.7 8529671 455.6 8529671 455.6
Vcells 10003423 76.4 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats_X_S = colOrderStats(X_S, which = which, na.rm = FALSE),
+ `colOrderStats(X, rows, cols)` = colOrderStats(X, rows = rows, cols = cols, which = which, na.rm = FALSE),
+ `colOrderStats(X[rows, cols])` = colOrderStats(X[rows, cols], which = which, na.rm = FALSE),
+ unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5255857 280.7 8529671 455.6 8529671 455.6
Vcells 10013475 76.4 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats_X_S = rowOrderStats(X_S, which = which, na.rm = FALSE),
+ `rowOrderStats(X, cols, rows)` = rowOrderStats(X, rows = cols, cols = rows, which = which, na.rm = FALSE),
+ `rowOrderStats(X[cols, rows])` = rowOrderStats(X[cols, rows], which = which, na.rm = FALSE),
+ unit = "ms")
Table: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on double+10x1000 data. The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
0.086610 |
0.0917185 |
0.1020895 |
0.100990 |
0.1133885 |
0.147192 |
2 |
colOrderStats(X, rows, cols) |
0.094552 |
0.1003440 |
0.1084901 |
0.103856 |
0.1148965 |
0.137158 |
3 |
colOrderStats(X[rows, cols]) |
0.102439 |
0.1082535 |
0.1181137 |
0.115427 |
0.1273390 |
0.142336 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.0000000 |
2 |
colOrderStats(X, rows, cols) |
1.091698 |
1.094043 |
1.062696 |
1.028379 |
1.013299 |
0.9318305 |
3 |
colOrderStats(X[rows, cols]) |
1.182762 |
1.180280 |
1.156962 |
1.142955 |
1.123033 |
0.9670091 |
Table: Benchmarking of rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on double+10x1000 data (transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
0.086129 |
0.0910005 |
0.0997548 |
0.0969575 |
0.1063175 |
0.124136 |
2 |
rowOrderStats(X, cols, rows) |
0.094281 |
0.1002510 |
0.1090320 |
0.1044765 |
0.1148525 |
0.160316 |
3 |
rowOrderStats(X[cols, rows]) |
0.095218 |
0.1040815 |
0.1138991 |
0.1096280 |
0.1226695 |
0.141255 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.00000 |
1.000000 |
1.000000 |
1.000000 |
2 |
rowOrderStats(X, cols, rows) |
1.094649 |
1.101653 |
1.09300 |
1.077549 |
1.080278 |
1.291454 |
3 |
rowOrderStats(X[cols, rows]) |
1.105528 |
1.143746 |
1.14179 |
1.130681 |
1.153803 |
1.137905 |
Figure: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on double+10x1000 data as well as rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on double+10x1000 data (original and transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
86.129 |
91.0005 |
99.7548 |
96.9575 |
106.3175 |
124.136 |
1 |
colOrderStats_X_S |
86.610 |
91.7185 |
102.0895 |
100.9900 |
113.3885 |
147.192 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
2 |
rowOrderStats_X_S |
1.000000 |
1.00000 |
1.000000 |
1.00000 |
1.000000 |
1.000000 |
1 |
colOrderStats_X_S |
1.005585 |
1.00789 |
1.023404 |
1.04159 |
1.066508 |
1.185732 |
Figure: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on double+10x1000 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

100x1000 double matrix
> X <- data[["100x1000"]]
> rows <- sample.int(nrow(X), size = nrow(X) * 0.7)
> cols <- sample.int(ncol(X), size = ncol(X) * 0.7)
> X_S <- X[rows, cols]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5256095 280.8 8529671 455.6 8529671 455.6
Vcells 10048999 76.7 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats_X_S = colOrderStats(X_S, which = which, na.rm = FALSE),
+ `colOrderStats(X, rows, cols)` = colOrderStats(X, rows = rows, cols = cols, which = which, na.rm = FALSE),
+ `colOrderStats(X[rows, cols])` = colOrderStats(X[rows, cols], which = which, na.rm = FALSE),
+ unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5256070 280.8 8529671 455.6 8529671 455.6
Vcells 10149051 77.5 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats_X_S = rowOrderStats(X_S, which = which, na.rm = FALSE),
+ `rowOrderStats(X, cols, rows)` = rowOrderStats(X, rows = cols, cols = rows, which = which, na.rm = FALSE),
+ `rowOrderStats(X[cols, rows])` = rowOrderStats(X[cols, rows], which = which, na.rm = FALSE),
+ unit = "ms")
Table: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on double+100x1000 data. The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
0.835678 |
0.896137 |
0.9335153 |
0.9173680 |
0.9379235 |
1.392036 |
2 |
colOrderStats(X, rows, cols) |
0.883599 |
0.935617 |
0.9722624 |
0.9593905 |
0.9864415 |
1.469212 |
3 |
colOrderStats(X[rows, cols]) |
0.937055 |
0.993524 |
1.0438145 |
1.0152320 |
1.0429670 |
1.485851 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
colOrderStats(X, rows, cols) |
1.057344 |
1.044056 |
1.041507 |
1.045808 |
1.051729 |
1.055441 |
3 |
colOrderStats(X[rows, cols]) |
1.121311 |
1.108674 |
1.118155 |
1.106679 |
1.111996 |
1.067394 |
Table: Benchmarking of rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on double+100x1000 data (transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
0.845700 |
0.892443 |
0.9384381 |
0.9193235 |
0.9458535 |
1.414871 |
2 |
rowOrderStats(X, cols, rows) |
0.898562 |
0.952768 |
0.9829346 |
0.9772265 |
0.9901595 |
1.463661 |
3 |
rowOrderStats(X[cols, rows]) |
0.942543 |
0.995193 |
1.0435908 |
1.0233440 |
1.0528555 |
1.438909 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
rowOrderStats(X, cols, rows) |
1.062507 |
1.067595 |
1.047416 |
1.062984 |
1.046842 |
1.034484 |
3 |
rowOrderStats(X[cols, rows]) |
1.114512 |
1.115133 |
1.112051 |
1.113149 |
1.113128 |
1.016989 |
Figure: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on double+100x1000 data as well as rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on double+100x1000 data (original and transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
835.678 |
896.137 |
933.5154 |
917.3680 |
937.9235 |
1392.036 |
2 |
rowOrderStats_X_S |
845.700 |
892.443 |
938.4381 |
919.3235 |
945.8535 |
1414.871 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
1.000000 |
1.0000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
rowOrderStats_X_S |
1.011993 |
0.9958779 |
1.005273 |
1.002132 |
1.008455 |
1.016404 |
Figure: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on double+100x1000 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

1000x100 double matrix
> X <- data[["1000x100"]]
> rows <- sample.int(nrow(X), size = nrow(X) * 0.7)
> cols <- sample.int(ncol(X), size = ncol(X) * 0.7)
> X_S <- X[rows, cols]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5256305 280.8 8529671 455.6 8529671 455.6
Vcells 10049140 76.7 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats_X_S = colOrderStats(X_S, which = which, na.rm = FALSE),
+ `colOrderStats(X, rows, cols)` = colOrderStats(X, rows = rows, cols = cols, which = which, na.rm = FALSE),
+ `colOrderStats(X[rows, cols])` = colOrderStats(X[rows, cols], which = which, na.rm = FALSE),
+ unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5256280 280.8 8529671 455.6 8529671 455.6
Vcells 10149192 77.5 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats_X_S = rowOrderStats(X_S, which = which, na.rm = FALSE),
+ `rowOrderStats(X, cols, rows)` = rowOrderStats(X, rows = cols, cols = rows, which = which, na.rm = FALSE),
+ `rowOrderStats(X[cols, rows])` = rowOrderStats(X[cols, rows], which = which, na.rm = FALSE),
+ unit = "ms")
Table: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on double+1000x100 data. The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
0.783454 |
0.8506020 |
0.8879021 |
0.862810 |
0.8877890 |
1.340953 |
2 |
colOrderStats(X, rows, cols) |
0.831492 |
0.8801045 |
0.9451680 |
0.906893 |
0.9446670 |
1.465697 |
3 |
colOrderStats(X[rows, cols]) |
0.877424 |
0.9275830 |
0.9730777 |
0.958752 |
0.9853235 |
1.524288 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
colOrderStats(X, rows, cols) |
1.061316 |
1.034684 |
1.064496 |
1.051092 |
1.064067 |
1.093026 |
3 |
colOrderStats(X[rows, cols]) |
1.119943 |
1.090502 |
1.095929 |
1.111197 |
1.109862 |
1.136720 |
Table: Benchmarking of rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on double+1000x100 data (transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
0.796667 |
0.848986 |
0.8939137 |
0.8741080 |
0.9011475 |
1.206986 |
2 |
rowOrderStats(X, cols, rows) |
0.858375 |
0.906867 |
0.9590285 |
0.9357470 |
0.9666135 |
1.492408 |
3 |
rowOrderStats(X[cols, rows]) |
0.895784 |
0.965499 |
1.0027349 |
0.9962755 |
1.0237755 |
1.412029 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
rowOrderStats_X_S |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
2 |
rowOrderStats(X, cols, rows) |
1.077458 |
1.068177 |
1.072842 |
1.070517 |
1.072647 |
1.236475 |
3 |
rowOrderStats(X[cols, rows]) |
1.124415 |
1.137238 |
1.121736 |
1.139763 |
1.136080 |
1.169880 |
Figure: Benchmarking of colOrderStats_X_S(), colOrderStats(X, rows, cols)() and colOrderStats(X[rows, cols])() on double+1000x100 data as well as rowOrderStats_X_S(), rowOrderStats(X, cols, rows)() and rowOrderStats(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on double+1000x100 data (original and transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
783.454 |
850.602 |
887.9021 |
862.810 |
887.7890 |
1340.953 |
2 |
rowOrderStats_X_S |
796.667 |
848.986 |
893.9137 |
874.108 |
901.1475 |
1206.986 |
|
expr |
min |
lq |
mean |
median |
uq |
max |
1 |
colOrderStats_X_S |
1.000000 |
1.0000000 |
1.000000 |
1.000000 |
1.000000 |
1.0000000 |
2 |
rowOrderStats_X_S |
1.016865 |
0.9981002 |
1.006771 |
1.013094 |
1.015047 |
0.9000957 |
Figure: Benchmarking of colOrderStats_X_S() and rowOrderStats_X_S() on double+1000x100 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

Appendix
R version 4.1.1 Patched (2021-08-10 r80727)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.5 LTS
Matrix products: default
BLAS: /home/hb/software/R-devel/R-4-1-branch/lib/R/lib/libRblas.so
LAPACK: /home/hb/software/R-devel/R-4-1-branch/lib/R/lib/libRlapack.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] microbenchmark_1.4-7 matrixStats_0.60.1 ggplot2_3.3.5
[4] knitr_1.33 R.devices_2.17.0 R.utils_2.10.1
[7] R.oo_1.24.0 R.methodsS3_1.8.1-9001 history_0.0.1-9000
loaded via a namespace (and not attached):
[1] Biobase_2.52.0 httr_1.4.2 splines_4.1.1
[4] bit64_4.0.5 network_1.17.1 assertthat_0.2.1
[7] highr_0.9 stats4_4.1.1 blob_1.2.2
[10] GenomeInfoDbData_1.2.6 robustbase_0.93-8 pillar_1.6.2
[13] RSQLite_2.2.8 lattice_0.20-44 glue_1.4.2
[16] digest_0.6.27 XVector_0.32.0 colorspace_2.0-2
[19] Matrix_1.3-4 XML_3.99-0.7 pkgconfig_2.0.3
[22] zlibbioc_1.38.0 genefilter_1.74.0 purrr_0.3.4
[25] ergm_4.1.2 xtable_1.8-4 scales_1.1.1
[28] tibble_3.1.4 annotate_1.70.0 KEGGREST_1.32.0
[31] farver_2.1.0 generics_0.1.0 IRanges_2.26.0
[34] ellipsis_0.3.2 cachem_1.0.6 withr_2.4.2
[37] BiocGenerics_0.38.0 mime_0.11 survival_3.2-13
[40] magrittr_2.0.1 crayon_1.4.1 statnet.common_4.5.0
[43] memoise_2.0.0 laeken_0.5.1 fansi_0.5.0
[46] R.cache_0.15.0 MASS_7.3-54 R.rsp_0.44.0
[49] progressr_0.8.0 tools_4.1.1 lifecycle_1.0.0
[52] S4Vectors_0.30.0 trust_0.1-8 munsell_0.5.0
[55] tabby_0.0.1-9001 AnnotationDbi_1.54.1 Biostrings_2.60.2
[58] compiler_4.1.1 GenomeInfoDb_1.28.1 rlang_0.4.11
[61] grid_4.1.1 RCurl_1.98-1.4 cwhmisc_6.6
[64] rappdirs_0.3.3 startup_0.15.0 labeling_0.4.2
[67] bitops_1.0-7 base64enc_0.1-3 boot_1.3-28
[70] gtable_0.3.0 DBI_1.1.1 markdown_1.1
[73] R6_2.5.1 lpSolveAPI_5.5.2.0-17.7 rle_0.9.2
[76] dplyr_1.0.7 fastmap_1.1.0 bit_4.0.4
[79] utf8_1.2.2 parallel_4.1.1 Rcpp_1.0.7
[82] vctrs_0.3.8 png_0.1-7 DEoptimR_1.0-9
[85] tidyselect_1.1.1 xfun_0.25 coda_0.19-4
Total processing time was 25.35 secs.
Reproducibility
To reproduce this report, do:
html <- matrixStats:::benchmark('colRowOrderStats_subset')
Copyright Dongcan Jiang. Last updated on 2021-08-25 19:01:46 (+0200 UTC). Powered by RSP.