This report benchmark the performance of colOrderStats() and rowOrderStats() against alternative methods.
> 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)
> X <- data[["10x10"]]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5269306 281.5 8529671 455.6 8529671 455.6
Vcells 10317661 78.8 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats = colOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 2L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), `rowQ(t(X))` = rowQ(t(X),
+ which = which), unit = "ms")
> X <- t(X)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5258875 280.9 8529671 455.6 8529671 455.6
Vcells 10283551 78.5 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats = rowOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 1L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), rowQ = rowQ(X, which = which),
+ unit = "ms")
Table: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() 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 | 0.002396 | 0.0037805 | 0.0062407 | 0.0070845 | 0.0077215 | 0.021831 |
| 3 | rowQ(t(X)) | 0.012643 | 0.0168480 | 0.0226396 | 0.0232330 | 0.0261490 | 0.087454 |
| 2 | apply+quantile | 0.975088 | 1.0036845 | 1.1207877 | 1.0441720 | 1.1999000 | 1.862094 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ(t(X)) | 5.276711 | 4.456553 | 3.627766 | 3.279413 | 3.386518 | 4.005955 |
| 2 | apply+quantile | 406.964942 | 265.489882 | 179.594704 | 147.388242 | 155.397267 | 85.295864 |
Table: Benchmarking of rowOrderStats(), apply+quantile() and rowQ() 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 | 0.002694 | 0.0040520 | 0.0065888 | 0.0069900 | 0.0079115 | 0.022313 |
| 3 | rowQ | 0.009588 | 0.0123015 | 0.0178083 | 0.0177435 | 0.0212500 | 0.066164 |
| 2 | apply+quantile | 0.970525 | 1.0066915 | 1.1155095 | 1.0487675 | 1.1791805 | 1.865108 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | rowOrderStats | 1.00000 | 1.000000 | 1.00000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ | 3.55902 | 3.035908 | 2.70281 | 2.538412 | 2.685964 | 2.965267 |
| 2 | apply+quantile | 360.25427 | 248.443115 | 169.30338 | 150.038269 | 149.046388 | 83.588401 |
Figure: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() on integer+10x10 data as well as rowOrderStats(), apply+quantile() and rowQ() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats() and rowOrderStats() 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 | |
|---|---|---|---|---|---|---|---|
| 2 | rowOrderStats | 2.694 | 4.0520 | 6.58882 | 6.9900 | 7.9115 | 22.313 |
| 1 | colOrderStats | 2.396 | 3.7805 | 6.24065 | 7.0845 | 7.7215 | 21.831 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 2 | rowOrderStats | 1.0000000 | 1.0000000 | 1.0000000 | 1.000000 | 1.0000000 | 1.0000000 |
| 1 | colOrderStats | 0.8893838 | 0.9329961 | 0.9471575 | 1.013519 | 0.9759843 | 0.9783982 |
Figure: Benchmarking of colOrderStats() and rowOrderStats() on integer+10x10 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

> X <- data[["100x100"]]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5257430 280.8 8529671 455.6 8529671 455.6
Vcells 9900114 75.6 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats = colOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 2L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), `rowQ(t(X))` = rowQ(t(X),
+ which = which), unit = "ms")
> X <- t(X)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5257423 280.8 8529671 455.6 8529671 455.6
Vcells 9905220 75.6 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats = rowOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 1L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), rowQ = rowQ(X, which = which),
+ unit = "ms")
Table: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() 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 | 0.121116 | 0.135349 | 0.1434340 | 0.1414745 | 0.1488490 | 0.221667 |
| 3 | rowQ(t(X)) | 0.279749 | 0.305540 | 0.3258962 | 0.3175130 | 0.3356855 | 0.677341 |
| 2 | apply+quantile | 9.943573 | 10.994908 | 11.5292535 | 11.2429440 | 11.5286880 | 19.321712 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ(t(X)) | 2.309761 | 2.257423 | 2.272099 | 2.244313 | 2.255208 | 3.055669 |
| 2 | apply+quantile | 82.099582 | 81.233759 | 80.380216 | 79.469756 | 77.452237 | 87.165487 |
Table: Benchmarking of rowOrderStats(), apply+quantile() and rowQ() 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 | 0.119327 | 0.1333260 | 0.1420992 | 0.1403775 | 0.1497055 | 0.209515 |
| 3 | rowQ | 0.250628 | 0.2823345 | 0.2976014 | 0.2914755 | 0.3103715 | 0.462297 |
| 2 | apply+quantile | 9.926337 | 11.0183420 | 11.5296399 | 11.2123495 | 11.4981340 | 19.613236 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | rowOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.00000 |
| 3 | rowQ | 2.100346 | 2.117625 | 2.094322 | 2.076369 | 2.073214 | 2.20651 |
| 2 | apply+quantile | 83.186010 | 82.642110 | 81.137970 | 79.872839 | 76.805020 | 93.61256 |
Figure: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() on integer+100x100 data as well as rowOrderStats(), apply+quantile() and rowQ() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats() and rowOrderStats() 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 | 119.327 | 133.326 | 142.0992 | 140.3775 | 149.7055 | 209.515 |
| 1 | colOrderStats | 121.116 | 135.349 | 143.4340 | 141.4745 | 148.8490 | 221.667 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 2 | rowOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.0000000 | 1.000000 |
| 1 | colOrderStats | 1.014992 | 1.015173 | 1.009393 | 1.007815 | 0.9942788 | 1.058001 |
Figure: Benchmarking of colOrderStats() and rowOrderStats() on integer+100x100 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

> X <- data[["1000x10"]]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5256850 280.8 8529671 455.6 8529671 455.6
Vcells 9878091 75.4 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats = colOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 2L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), `rowQ(t(X))` = rowQ(t(X),
+ which = which), unit = "ms")
> X <- t(X)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5256837 280.8 8529671 455.6 8529671 455.6
Vcells 9883187 75.5 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats = rowOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 1L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), rowQ = rowQ(X, which = which),
+ unit = "ms")
Table: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() 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 | 0.106410 | 0.1168395 | 0.1242575 | 0.1211515 | 0.1248625 | 0.197992 |
| 3 | rowQ(t(X)) | 0.250002 | 0.2777335 | 0.2898191 | 0.2861890 | 0.2938555 | 0.421549 |
| 2 | apply+quantile | 1.310605 | 1.4263815 | 1.5075162 | 1.4662695 | 1.5187220 | 2.356509 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ(t(X)) | 2.349422 | 2.377051 | 2.332407 | 2.362241 | 2.353433 | 2.129121 |
| 2 | apply+quantile | 12.316559 | 12.208042 | 12.132194 | 12.102776 | 12.163156 | 11.902041 |
Table: Benchmarking of rowOrderStats(), apply+quantile() and rowQ() 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 | 0.106115 | 0.1147415 | 0.1261883 | 0.1194615 | 0.1326435 | 0.200507 |
| 3 | rowQ | 0.235041 | 0.2544380 | 0.2738397 | 0.2633070 | 0.2739980 | 0.479350 |
| 2 | apply+quantile | 1.319350 | 1.4084165 | 1.5141066 | 1.4477820 | 1.5399640 | 2.374097 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | rowOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.00000 |
| 3 | rowQ | 2.214965 | 2.217489 | 2.170088 | 2.204116 | 2.065672 | 2.39069 |
| 2 | apply+quantile | 12.433209 | 12.274691 | 11.998786 | 12.119235 | 11.609796 | 11.84047 |
Figure: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() on integer+1000x10 data as well as rowOrderStats(), apply+quantile() and rowQ() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats() and rowOrderStats() 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 | 106.115 | 114.7415 | 126.1883 | 119.4615 | 132.6435 | 200.507 |
| 1 | colOrderStats | 106.410 | 116.8395 | 124.2575 | 121.1515 | 124.8625 | 197.992 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 2 | rowOrderStats | 1.00000 | 1.000000 | 1.0000000 | 1.000000 | 1.000000 | 1.0000000 |
| 1 | colOrderStats | 1.00278 | 1.018285 | 0.9846991 | 1.014147 | 0.941339 | 0.9874568 |
Figure: Benchmarking of colOrderStats() and rowOrderStats() on integer+1000x10 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

> X <- data[["10x1000"]]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5257057 280.8 8529671 455.6 8529671 455.6
Vcells 9878897 75.4 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats = colOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 2L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), `rowQ(t(X))` = rowQ(t(X),
+ which = which), unit = "ms")
> X <- t(X)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5257050 280.8 8529671 455.6 8529671 455.6
Vcells 9884003 75.5 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats = rowOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 1L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), rowQ = rowQ(X, which = which),
+ unit = "ms")
Table: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() 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 | 0.124002 | 0.1318285 | 0.1431571 | 0.1378460 | 0.1554585 | 0.185293 |
| 3 | rowQ(t(X)) | 0.269732 | 0.3016940 | 0.3238651 | 0.3193965 | 0.3494285 | 0.392793 |
| 2 | apply+quantile | 101.607258 | 106.5879280 | 110.3892779 | 107.7140460 | 114.1283415 | 139.618113 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ(t(X)) | 2.175223 | 2.288534 | 2.262306 | 2.317053 | 2.247729 | 2.119848 |
| 2 | apply+quantile | 819.400155 | 808.534786 | 771.105854 | 781.408572 | 734.140246 | 753.499123 |
Table: Benchmarking of rowOrderStats(), apply+quantile() and rowQ() 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 | 0.125915 | 0.1338215 | 0.1532770 | 0.1493295 | 0.1570805 | 0.788864 |
| 3 | rowQ | 0.273050 | 0.2898920 | 0.3083554 | 0.3069140 | 0.3276880 | 0.355935 |
| 2 | apply+quantile | 103.987802 | 108.3288355 | 111.7019650 | 109.5762585 | 114.3073555 | 150.291124 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | rowOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.00000 | 1.000000 | 1.0000000 |
| 3 | rowQ | 2.168526 | 2.166259 | 2.011753 | 2.05528 | 2.086115 | 0.4511994 |
| 2 | apply+quantile | 825.857142 | 809.502475 | 728.759006 | 733.78842 | 727.699208 | 190.5158861 |
Figure: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() on integer+10x1000 data as well as rowOrderStats(), apply+quantile() and rowQ() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats() and rowOrderStats() 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 | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 124.002 | 131.8285 | 143.1571 | 137.8460 | 155.4585 | 185.293 |
| 2 | rowOrderStats | 125.915 | 133.8215 | 153.2770 | 149.3295 | 157.0805 | 788.864 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 2 | rowOrderStats | 1.015427 | 1.015118 | 1.070691 | 1.083307 | 1.010434 | 4.257387 |
Figure: Benchmarking of colOrderStats() and rowOrderStats() on integer+10x1000 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

> X <- data[["100x1000"]]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5257261 280.8 8529671 455.6 8529671 455.6
Vcells 9879471 75.4 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats = colOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 2L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), `rowQ(t(X))` = rowQ(t(X),
+ which = which), unit = "ms")
> X <- t(X)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5257254 280.8 8529671 455.6 8529671 455.6
Vcells 9929577 75.8 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats = rowOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 1L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), rowQ = rowQ(X, which = which),
+ unit = "ms")
Table: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() 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 | 1.219348 | 1.365900 | 1.381086 | 1.384183 | 1.408145 | 1.720466 |
| 3 | rowQ(t(X)) | 2.775344 | 3.082995 | 3.132328 | 3.139558 | 3.185383 | 3.591160 |
| 2 | apply+quantile | 111.164408 | 115.238164 | 122.089223 | 116.179811 | 122.372979 | 480.882709 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ(t(X)) | 2.276089 | 2.257117 | 2.268017 | 2.268168 | 2.262113 | 2.087318 |
| 2 | apply+quantile | 91.167089 | 84.367936 | 88.400864 | 83.933882 | 86.903678 | 279.507243 |
Table: Benchmarking of rowOrderStats(), apply+quantile() and rowQ() 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 | 1.229144 | 1.352091 | 1.388292 | 1.380804 | 1.399889 | 1.901524 |
| 3 | rowQ | 2.855065 | 2.956792 | 3.016552 | 2.997631 | 3.050488 | 3.791487 |
| 2 | apply+quantile | 109.771326 | 116.278713 | 120.133722 | 117.287056 | 123.625769 | 137.379784 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | rowOrderStats | 1.000000 | 1.00000 | 1.000000 | 1.000000 | 1.000000 | 1.00000 |
| 3 | rowQ | 2.322808 | 2.18683 | 2.172851 | 2.170932 | 2.179093 | 1.99392 |
| 2 | apply+quantile | 89.307132 | 85.99921 | 86.533448 | 84.941133 | 88.311154 | 72.24720 |
Figure: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() on integer+100x1000 data as well as rowOrderStats(), apply+quantile() and rowQ() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats() and rowOrderStats() 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 | 1.229144 | 1.352091 | 1.388292 | 1.380804 | 1.399889 | 1.901524 |
| 1 | colOrderStats | 1.219348 | 1.365900 | 1.381086 | 1.384183 | 1.408145 | 1.720466 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 2 | rowOrderStats | 1.0000000 | 1.000000 | 1.0000000 | 1.000000 | 1.000000 | 1.0000000 |
| 1 | colOrderStats | 0.9920302 | 1.010213 | 0.9948094 | 1.002447 | 1.005898 | 0.9047827 |
Figure: Benchmarking of colOrderStats() and rowOrderStats() on integer+100x1000 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

> X <- data[["1000x100"]]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5257467 280.8 8529671 455.6 8529671 455.6
Vcells 9880161 75.4 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats = colOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 2L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), `rowQ(t(X))` = rowQ(t(X),
+ which = which), unit = "ms")
> X <- t(X)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5257460 280.8 8529671 455.6 8529671 455.6
Vcells 9930267 75.8 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats = rowOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 1L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), rowQ = rowQ(X, which = which),
+ unit = "ms")
Table: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() 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 | 1.078755 | 1.270765 | 1.321262 | 1.291163 | 1.328442 | 2.055190 |
| 3 | rowQ(t(X)) | 2.529615 | 2.949383 | 3.010792 | 3.016215 | 3.058868 | 3.766083 |
| 2 | apply+quantile | 13.201258 | 14.866861 | 15.268522 | 15.066990 | 15.257983 | 24.594818 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.000000 | 1.00000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ(t(X)) | 2.344939 | 2.32095 | 2.278724 | 2.336044 | 2.302598 | 1.832474 |
| 2 | apply+quantile | 12.237494 | 11.69914 | 11.556011 | 11.669312 | 11.485618 | 11.967175 |
Table: Benchmarking of rowOrderStats(), apply+quantile() and rowQ() 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 | 1.098761 | 1.262751 | 1.285397 | 1.281689 | 1.307838 | 1.459712 |
| 3 | rowQ | 2.436686 | 2.803228 | 2.854766 | 2.834445 | 2.870170 | 3.542653 |
| 2 | apply+quantile | 12.988127 | 14.762653 | 15.346651 | 14.920025 | 15.134125 | 37.313406 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | rowOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ | 2.217667 | 2.219938 | 2.220922 | 2.211492 | 2.194591 | 2.426953 |
| 2 | apply+quantile | 11.820703 | 11.690871 | 11.939232 | 11.640914 | 11.571861 | 25.562170 |
Figure: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() on integer+1000x100 data as well as rowOrderStats(), apply+quantile() and rowQ() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats() and rowOrderStats() 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 | 1.098761 | 1.262751 | 1.285397 | 1.281689 | 1.307838 | 1.459712 |
| 1 | colOrderStats | 1.078755 | 1.270765 | 1.321262 | 1.291163 | 1.328442 | 2.055190 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 2 | rowOrderStats | 1.0000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 1 | colOrderStats | 0.9817922 | 1.006347 | 1.027902 | 1.007393 | 1.015754 | 1.407942 |
Figure: Benchmarking of colOrderStats() and rowOrderStats() on integer+1000x100 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

> 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)
> X <- data[["10x10"]]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5257681 280.8 8529671 455.6 8529671 455.6
Vcells 9996062 76.3 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats = colOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 2L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), `rowQ(t(X))` = rowQ(t(X),
+ which = which), unit = "ms")
> X <- t(X)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5257665 280.8 8529671 455.6 8529671 455.6
Vcells 9996253 76.3 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats = rowOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 1L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), rowQ = rowQ(X, which = which),
+ unit = "ms")
Table: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() 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 | 0.002723 | 0.0040980 | 0.0071918 | 0.007184 | 0.008979 | 0.024424 |
| 3 | rowQ(t(X)) | 0.007045 | 0.0096715 | 0.0150802 | 0.013765 | 0.018273 | 0.064306 |
| 2 | apply+quantile | 0.974496 | 1.0605275 | 1.1666162 | 1.118092 | 1.240284 | 1.883778 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.00000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ(t(X)) | 2.58722 | 2.360054 | 2.096869 | 1.916063 | 2.035082 | 2.632902 |
| 2 | apply+quantile | 357.87587 | 258.791484 | 162.215224 | 155.636414 | 138.131585 | 77.128153 |
Table: Benchmarking of rowOrderStats(), apply+quantile() and rowQ() 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 | 0.002695 | 0.0044695 | 0.0070952 | 0.007262 | 0.0087205 | 0.022080 |
| 3 | rowQ | 0.004579 | 0.0057440 | 0.0096944 | 0.008419 | 0.0122845 | 0.041155 |
| 2 | apply+quantile | 0.980516 | 1.0507330 | 1.1473062 | 1.101219 | 1.2051105 | 1.888113 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | rowOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ | 1.699072 | 1.285155 | 1.366343 | 1.159323 | 1.408692 | 1.863904 |
| 2 | apply+quantile | 363.827829 | 235.089607 | 161.702652 | 151.641214 | 138.192822 | 85.512364 |
Figure: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() on double+10x10 data as well as rowOrderStats(), apply+quantile() and rowQ() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats() and rowOrderStats() 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 | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 2.723 | 4.0980 | 7.19178 | 7.184 | 8.9790 | 24.424 |
| 2 | rowOrderStats | 2.695 | 4.4695 | 7.09516 | 7.262 | 8.7205 | 22.080 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.0000000 | 1.000000 | 1.0000000 | 1.000000 | 1.0000000 | 1.0000000 |
| 2 | rowOrderStats | 0.9897172 | 1.090654 | 0.9865652 | 1.010857 | 0.9712106 | 0.9040288 |
Figure: Benchmarking of colOrderStats() and rowOrderStats() on double+10x10 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

> X <- data[["100x100"]]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5257877 280.9 8529671 455.6 8529671 455.6
Vcells 9997057 76.3 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats = colOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 2L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), `rowQ(t(X))` = rowQ(t(X),
+ which = which), unit = "ms")
> X <- t(X)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5257870 280.9 8529671 455.6 8529671 455.6
Vcells 10007163 76.4 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats = rowOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 1L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), rowQ = rowQ(X, which = which),
+ unit = "ms")
Table: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() 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 | 0.177703 | 0.1916150 | 0.1995934 | 0.1977870 | 0.2045805 | 0.288525 |
| 3 | rowQ(t(X)) | 0.212612 | 0.2432105 | 0.2591192 | 0.2526645 | 0.2739580 | 0.405890 |
| 2 | apply+quantile | 10.028506 | 11.4788985 | 11.9744905 | 11.6753335 | 11.9374215 | 21.520099 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ(t(X)) | 1.196446 | 1.269267 | 1.298235 | 1.277458 | 1.339121 | 1.406776 |
| 2 | apply+quantile | 56.434084 | 59.906054 | 59.994421 | 59.029833 | 58.350730 | 74.586601 |
Table: Benchmarking of rowOrderStats(), apply+quantile() and rowQ() 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 | 0.169022 | 0.1952500 | 0.2043069 | 0.2003635 | 0.211534 | 0.312825 |
| 3 | rowQ | 0.190266 | 0.2157775 | 0.2267057 | 0.2250685 | 0.233820 | 0.340676 |
| 2 | apply+quantile | 10.111341 | 11.4911475 | 12.0170979 | 11.7217235 | 11.949077 | 20.266493 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | rowOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ | 1.125688 | 1.105134 | 1.109633 | 1.123301 | 1.105354 | 1.089031 |
| 2 | apply+quantile | 59.822633 | 58.853508 | 58.818852 | 58.502290 | 56.487735 | 64.785401 |
Figure: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() on double+100x100 data as well as rowOrderStats(), apply+quantile() and rowQ() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats() and rowOrderStats() 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 | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 177.703 | 191.615 | 199.5934 | 197.7870 | 204.5805 | 288.525 |
| 2 | rowOrderStats | 169.022 | 195.250 | 204.3069 | 200.3635 | 211.5340 | 312.825 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.0000000 | 1.00000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 2 | rowOrderStats | 0.9511488 | 1.01897 | 1.023616 | 1.013027 | 1.033989 | 1.084221 |
Figure: Benchmarking of colOrderStats() and rowOrderStats() on double+100x100 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

> X <- data[["1000x10"]]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5258086 280.9 8529671 455.6 8529671 455.6
Vcells 9998142 76.3 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats = colOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 2L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), `rowQ(t(X))` = rowQ(t(X),
+ which = which), unit = "ms")
> X <- t(X)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5258079 280.9 8529671 455.6 8529671 455.6
Vcells 10008248 76.4 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats = rowOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 1L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), rowQ = rowQ(X, which = which),
+ unit = "ms")
Table: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() 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 | 0.144676 | 0.1657695 | 0.1733250 | 0.170141 | 0.1756655 | 0.252495 |
| 3 | rowQ(t(X)) | 0.184947 | 0.2107565 | 0.2218174 | 0.216962 | 0.2263955 | 0.321162 |
| 2 | apply+quantile | 1.373490 | 1.5201495 | 1.6075449 | 1.558847 | 1.5815890 | 2.483009 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ(t(X)) | 1.278353 | 1.271383 | 1.279777 | 1.275189 | 1.288787 | 1.271954 |
| 2 | apply+quantile | 9.493558 | 9.170260 | 9.274744 | 9.162089 | 9.003413 | 9.833894 |
Table: Benchmarking of rowOrderStats(), apply+quantile() and rowQ() 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 | 0.146966 | 0.166810 | 0.1767326 | 0.1734530 | 0.1828175 | 0.256861 |
| 3 | rowQ | 0.166082 | 0.184958 | 0.1979290 | 0.1940875 | 0.2004360 | 0.290413 |
| 2 | apply+quantile | 1.351771 | 1.534270 | 1.6172578 | 1.5654525 | 1.6522005 | 2.451222 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | rowOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ | 1.130071 | 1.108794 | 1.119935 | 1.118963 | 1.096372 | 1.130623 |
| 2 | apply+quantile | 9.197848 | 9.197710 | 9.150876 | 9.025226 | 9.037431 | 9.542990 |
Figure: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() on double+1000x10 data as well as rowOrderStats(), apply+quantile() and rowQ() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats() and rowOrderStats() 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 | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 144.676 | 165.7695 | 173.3250 | 170.141 | 175.6655 | 252.495 |
| 2 | rowOrderStats | 146.966 | 166.8100 | 176.7326 | 173.453 | 182.8175 | 256.861 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.000000 | 1.000000 | 1.00000 | 1.000000 | 1.000000 | 1.000000 |
| 2 | rowOrderStats | 1.015829 | 1.006277 | 1.01966 | 1.019466 | 1.040714 | 1.017291 |
Figure: Benchmarking of colOrderStats() and rowOrderStats() on double+1000x10 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

> X <- data[["10x1000"]]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5258299 280.9 8529671 455.6 8529671 455.6
Vcells 9998286 76.3 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats = colOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 2L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), `rowQ(t(X))` = rowQ(t(X),
+ which = which), unit = "ms")
> X <- t(X)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5258292 280.9 8529671 455.6 8529671 455.6
Vcells 10008392 76.4 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats = rowOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 1L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), rowQ = rowQ(X, which = which),
+ unit = "ms")
Table: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() 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 | 0.171737 | 0.186555 | 0.1968494 | 0.1938465 | 0.2065565 | 0.271162 |
| 3 | rowQ(t(X)) | 0.216194 | 0.236266 | 0.2577024 | 0.2605375 | 0.2819640 | 0.301067 |
| 2 | apply+quantile | 106.664616 | 109.549966 | 113.2855592 | 110.9872570 | 118.1856230 | 149.783925 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.00000 | 1.00000 | 1.000000 |
| 3 | rowQ(t(X)) | 1.258867 | 1.266468 | 1.309135 | 1.34404 | 1.36507 | 1.110285 |
| 2 | apply+quantile | 621.092811 | 587.226105 | 575.493633 | 572.55229 | 572.17092 | 552.378006 |
Table: Benchmarking of rowOrderStats(), apply+quantile() and rowQ() 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 | 0.181723 | 0.1886440 | 0.2014066 | 0.196627 | 0.2107015 | 0.287134 |
| 3 | rowQ | 0.204683 | 0.2125185 | 0.2283302 | 0.226741 | 0.2454870 | 0.268385 |
| 2 | apply+quantile | 105.972920 | 109.2857275 | 115.6893836 | 110.959095 | 115.5505770 | 477.361265 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | rowOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ | 1.126346 | 1.126559 | 1.133678 | 1.153153 | 1.165094 | 0.934703 |
| 2 | apply+quantile | 583.156342 | 579.322573 | 574.407141 | 564.312607 | 548.408896 | 1662.503448 |
Figure: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() on double+10x1000 data as well as rowOrderStats(), apply+quantile() and rowQ() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats() and rowOrderStats() 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 | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 171.737 | 186.555 | 196.8494 | 193.8465 | 206.5565 | 271.162 |
| 2 | rowOrderStats | 181.723 | 188.644 | 201.4066 | 196.6270 | 210.7015 | 287.134 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 2 | rowOrderStats | 1.058147 | 1.011198 | 1.023151 | 1.014344 | 1.020067 | 1.058902 |
Figure: Benchmarking of colOrderStats() and rowOrderStats() on double+10x1000 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

> X <- data[["100x1000"]]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5258503 280.9 8529671 455.6 8529671 455.6
Vcells 9999566 76.3 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats = colOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 2L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), `rowQ(t(X))` = rowQ(t(X),
+ which = which), unit = "ms")
> X <- t(X)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5258496 280.9 8529671 455.6 8529671 455.6
Vcells 10099672 77.1 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats = rowOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 1L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), rowQ = rowQ(X, which = which),
+ unit = "ms")
Table: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() 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 | 1.773591 | 1.933325 | 1.949205 | 1.944247 | 1.963194 | 2.416942 |
| 3 | rowQ(t(X)) | 2.169692 | 2.416991 | 2.491048 | 2.469575 | 2.564758 | 2.794766 |
| 2 | apply+quantile | 114.188566 | 118.126534 | 123.401497 | 119.857953 | 128.084724 | 145.367849 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ(t(X)) | 1.223333 | 1.250173 | 1.277982 | 1.270196 | 1.306421 | 1.156323 |
| 2 | apply+quantile | 64.382694 | 61.100195 | 63.308629 | 61.647477 | 65.243030 | 60.145361 |
Table: Benchmarking of rowOrderStats(), apply+quantile() and rowQ() 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 | 1.801919 | 1.911488 | 1.965733 | 1.942744 | 1.988827 | 2.659659 |
| 3 | rowQ | 1.978909 | 2.155988 | 2.237016 | 2.224080 | 2.308471 | 2.666294 |
| 2 | apply+quantile | 111.111029 | 117.869459 | 122.544606 | 119.899045 | 126.599067 | 150.167055 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | rowOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.00000 | 1.000000 |
| 3 | rowQ | 1.098223 | 1.127911 | 1.138006 | 1.144814 | 1.16072 | 1.002495 |
| 2 | apply+quantile | 61.662610 | 61.663703 | 62.340417 | 61.716338 | 63.65513 | 56.461018 |
Figure: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() on double+100x1000 data as well as rowOrderStats(), apply+quantile() and rowQ() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats() and rowOrderStats() 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 | |
|---|---|---|---|---|---|---|---|
| 2 | rowOrderStats | 1.801919 | 1.911488 | 1.965733 | 1.942744 | 1.988827 | 2.659659 |
| 1 | colOrderStats | 1.773591 | 1.933325 | 1.949205 | 1.944247 | 1.963194 | 2.416942 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 2 | rowOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.0000000 | 1.0000000 |
| 1 | colOrderStats | 0.984279 | 1.011424 | 0.991592 | 1.000774 | 0.9871113 | 0.9087413 |
Figure: Benchmarking of colOrderStats() and rowOrderStats() on double+100x1000 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

> X <- data[["1000x100"]]
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5258709 280.9 8529671 455.6 8529671 455.6
Vcells 9999703 76.3 31876688 243.2 60562128 462.1
> probs <- 0.3
> which <- round(probs * nrow(X))
> colStats <- microbenchmark(colOrderStats = colOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 2L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), `rowQ(t(X))` = rowQ(t(X),
+ which = which), unit = "ms")
> X <- t(X)
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 5258702 280.9 8529671 455.6 8529671 455.6
Vcells 10099809 77.1 31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowOrderStats = rowOrderStats(X, which = which, na.rm = FALSE), `apply+quantile` = apply(X,
+ MARGIN = 1L, FUN = quantile, probs = probs, na.rm = FALSE, type = 3L), rowQ = rowQ(X, which = which),
+ unit = "ms")
Table: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() 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 | 1.569726 | 1.848809 | 1.905385 | 1.885864 | 1.920953 | 2.646510 |
| 3 | rowQ(t(X)) | 2.114182 | 2.348117 | 2.442088 | 2.413133 | 2.509334 | 3.642366 |
| 2 | apply+quantile | 13.820662 | 15.439949 | 15.864930 | 15.625089 | 15.898580 | 25.050803 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ(t(X)) | 1.346848 | 1.270070 | 1.281677 | 1.279590 | 1.306296 | 1.376290 |
| 2 | apply+quantile | 8.804506 | 8.351295 | 8.326363 | 8.285374 | 8.276400 | 9.465599 |
Table: Benchmarking of rowOrderStats(), apply+quantile() and rowQ() 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 | 1.676724 | 1.899617 | 1.927373 | 1.924489 | 1.956063 | 2.169934 |
| 3 | rowQ | 1.905838 | 2.104718 | 2.156928 | 2.125433 | 2.196982 | 2.647807 |
| 2 | apply+quantile | 13.425054 | 15.419405 | 15.919382 | 15.604428 | 15.870903 | 24.963535 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | rowOrderStats | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| 3 | rowQ | 1.136644 | 1.107970 | 1.119103 | 1.104414 | 1.123165 | 1.220225 |
| 2 | apply+quantile | 8.006717 | 8.117113 | 8.259629 | 8.108347 | 8.113695 | 11.504283 |
Figure: Benchmarking of colOrderStats(), apply+quantile() and rowQ(t(X))() on double+1000x100 data as well as rowOrderStats(), apply+quantile() and rowQ() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colOrderStats() and rowOrderStats() 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 | 1.569726 | 1.848809 | 1.905385 | 1.885864 | 1.920953 | 2.646510 |
| 2 | rowOrderStats | 1.676724 | 1.899617 | 1.927373 | 1.924489 | 1.956063 | 2.169934 |
| expr | min | lq | mean | median | uq | max | |
|---|---|---|---|---|---|---|---|
| 1 | colOrderStats | 1.000000 | 1.000000 | 1.00000 | 1.000000 | 1.000000 | 1.0000000 |
| 2 | rowOrderStats | 1.068164 | 1.027481 | 1.01154 | 1.020482 | 1.018277 | 0.8199228 |
Figure: Benchmarking of colOrderStats() and rowOrderStats() on double+1000x100 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

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 2.22 mins.
To reproduce this report, do:
html <- matrixStats:::benchmark('colOrderStats')
Copyright Henrik Bengtsson. Last updated on 2021-08-25 19:04:01 (+0200 UTC). Powered by RSP.