matrixStats.benchmarks


colMads() and rowMads() benchmarks on subsetted computation

This report benchmark the performance of colMads() and rowMads() 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  5230613 279.4    8529671 455.6  8529671 455.6
Vcells 10010013  76.4   31876688 243.2 60562128 462.1
> colStats <- microbenchmark(colMads_X_S = colMads(X_S, na.rm = FALSE), `colMads(X, rows, cols)` = colMads(X, 
+     rows = rows, cols = cols, na.rm = FALSE), `colMads(X[rows, cols])` = colMads(X[rows, cols], na.rm = FALSE), 
+     unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
          used  (Mb) gc trigger  (Mb) max used  (Mb)
Ncells 5222666 279.0    8529671 455.6  8529671 455.6
Vcells 9983739  76.2   31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowMads_X_S = rowMads(X_S, na.rm = FALSE), `rowMads(X, cols, rows)` = rowMads(X, 
+     rows = cols, cols = rows, na.rm = FALSE), `rowMads(X[cols, rows])` = rowMads(X[cols, rows], na.rm = FALSE), 
+     unit = "ms")

Table: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(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 colMads_X_S 0.002897 0.0030155 0.0058568 0.0031005 0.0031965 0.275000
2 colMads(X, rows, cols) 0.003300 0.0034380 0.0035962 0.0035395 0.0036545 0.006543
3 colMads(X[rows, cols]) 0.003731 0.0040170 0.0043862 0.0041550 0.0043645 0.018293
  expr min lq mean median uq max
1 colMads_X_S 1.000000 1.000000 1.0000000 1.000000 1.000000 1.0000000
2 colMads(X, rows, cols) 1.139109 1.140109 0.6140243 1.141590 1.143282 0.0237927
3 colMads(X[rows, cols]) 1.287884 1.332117 0.7489081 1.340106 1.365400 0.0665200

Table: Benchmarking of rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(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 rowMads_X_S 0.002952 0.003079 0.0032072 0.0031660 0.0032480 0.006710
2 rowMads(X, cols, rows) 0.003306 0.003475 0.0064096 0.0035395 0.0036735 0.270258
3 rowMads(X[cols, rows]) 0.003782 0.004016 0.0042449 0.0041560 0.0042925 0.007147
  expr min lq mean median uq max
1 rowMads_X_S 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
2 rowMads(X, cols, rows) 1.119919 1.128613 1.998491 1.117972 1.131004 40.276900
3 rowMads(X[cols, rows]) 1.281165 1.304320 1.323547 1.312697 1.321583 1.065127

Figure: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(X[rows, cols])() on integer+10x10 data as well as rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colMads_X_S() and rowMads_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 colMads_X_S 2.897 3.0155 5.85682 3.1005 3.1965 275.00
2 rowMads_X_S 2.952 3.0790 3.20720 3.1660 3.2480 6.71
  expr min lq mean median uq max
1 colMads_X_S 1.000000 1.000000 1.0000000 1.000000 1.000000 1.0000
2 rowMads_X_S 1.018985 1.021058 0.5476009 1.021126 1.016111 0.0244

Figure: Benchmarking of colMads_X_S() and rowMads_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 5221596 278.9    8529671 455.6  8529671 455.6
Vcells 9652762  73.7   31876688 243.2 60562128 462.1
> colStats <- microbenchmark(colMads_X_S = colMads(X_S, na.rm = FALSE), `colMads(X, rows, cols)` = colMads(X, 
+     rows = rows, cols = cols, na.rm = FALSE), `colMads(X[rows, cols])` = colMads(X[rows, cols], na.rm = FALSE), 
+     unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
          used  (Mb) gc trigger  (Mb) max used  (Mb)
Ncells 5221572 278.9    8529671 455.6  8529671 455.6
Vcells 9657815  73.7   31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowMads_X_S = rowMads(X_S, na.rm = FALSE), `rowMads(X, cols, rows)` = rowMads(X, 
+     rows = cols, cols = rows, na.rm = FALSE), `rowMads(X[cols, rows])` = rowMads(X[cols, rows], na.rm = FALSE), 
+     unit = "ms")

Table: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(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
2 colMads(X, rows, cols) 0.133489 0.1427000 0.1643306 0.1620720 0.1762455 0.229778
1 colMads_X_S 0.133940 0.1420545 0.1653787 0.1640340 0.1782025 0.230007
3 colMads(X[rows, cols]) 0.141483 0.1520570 0.1757110 0.1737415 0.1913060 0.269344
  expr min lq mean median uq max
2 colMads(X, rows, cols) 1.000000 1.0000000 1.000000 1.000000 1.000000 1.000000
1 colMads_X_S 1.003379 0.9954765 1.006378 1.012106 1.011104 1.000997
3 colMads(X[rows, cols]) 1.059885 1.0655711 1.069253 1.072002 1.085452 1.172192

Table: Benchmarking of rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(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
2 rowMads(X, cols, rows) 0.134054 0.1444445 0.1645099 0.1610480 0.176094 0.242336
1 rowMads_X_S 0.137631 0.1461835 0.1689280 0.1673675 0.183561 0.224565
3 rowMads(X[cols, rows]) 0.145598 0.1560775 0.1765251 0.1731375 0.190183 0.239563
  expr min lq mean median uq max
2 rowMads(X, cols, rows) 1.000000 1.000000 1.000000 1.000000 1.000000 1.0000000
1 rowMads_X_S 1.026683 1.012039 1.026856 1.039240 1.042404 0.9266679
3 rowMads(X[cols, rows]) 1.086115 1.080536 1.073036 1.075068 1.080008 0.9885572

Figure: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(X[rows, cols])() on integer+100x100 data as well as rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colMads_X_S() and rowMads_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
1 colMads_X_S 133.940 142.0545 165.3787 164.0340 178.2025 230.007
2 rowMads_X_S 137.631 146.1835 168.9280 167.3675 183.5610 224.565
  expr min lq mean median uq max
1 colMads_X_S 1.000000 1.000000 1.000000 1.000000 1.00000 1.0000000
2 rowMads_X_S 1.027557 1.029066 1.021462 1.020322 1.03007 0.9763399

Figure: Benchmarking of colMads_X_S() and rowMads_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 5222338 279.0    8529671 455.6  8529671 455.6
Vcells 9656804  73.7   31876688 243.2 60562128 462.1
> colStats <- microbenchmark(colMads_X_S = colMads(X_S, na.rm = FALSE), `colMads(X, rows, cols)` = colMads(X, 
+     rows = rows, cols = cols, na.rm = FALSE), `colMads(X[rows, cols])` = colMads(X[rows, cols], na.rm = FALSE), 
+     unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
          used  (Mb) gc trigger  (Mb) max used  (Mb)
Ncells 5222314 279.0    8529671 455.6  8529671 455.6
Vcells 9661857  73.8   31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowMads_X_S = rowMads(X_S, na.rm = FALSE), `rowMads(X, cols, rows)` = rowMads(X, 
+     rows = cols, cols = rows, na.rm = FALSE), `rowMads(X[cols, rows])` = rowMads(X[cols, rows], na.rm = FALSE), 
+     unit = "ms")

Table: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(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
2 colMads(X, rows, cols) 0.117453 0.1247245 0.1396233 0.1364435 0.1481360 0.186024
1 colMads_X_S 0.115756 0.1296875 0.1410565 0.1382630 0.1474685 0.207656
3 colMads(X[rows, cols]) 0.123733 0.1314120 0.1472302 0.1438235 0.1582085 0.228173
  expr min lq mean median uq max
2 colMads(X, rows, cols) 1.0000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 colMads_X_S 0.9855517 1.039792 1.010265 1.013335 0.995494 1.116286
3 colMads(X[rows, cols]) 1.0534682 1.053618 1.054481 1.054088 1.067995 1.226578

Table: Benchmarking of rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(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 rowMads_X_S 0.119852 0.1342820 0.1505124 0.1431685 0.1527535 0.251675
2 rowMads(X, cols, rows) 0.117795 0.1277995 0.1474039 0.1459425 0.1574675 0.239278
3 rowMads(X[cols, rows]) 0.129588 0.1424825 0.1649833 0.1585315 0.1696535 0.289764
  expr min lq mean median uq max
1 rowMads_X_S 1.0000000 1.0000000 1.0000000 1.000000 1.000000 1.000000
2 rowMads(X, cols, rows) 0.9828372 0.9517247 0.9793474 1.019376 1.030860 0.950742
3 rowMads(X[cols, rows]) 1.0812335 1.0610692 1.0961446 1.107307 1.110636 1.151342

Figure: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(X[rows, cols])() on integer+1000x10 data as well as rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colMads_X_S() and rowMads_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
1 colMads_X_S 115.756 129.6875 141.0565 138.2630 147.4685 207.656
2 rowMads_X_S 119.852 134.2820 150.5124 143.1685 152.7535 251.675
  expr min lq mean median uq max
1 colMads_X_S 1.000000 1.000000 1.000000 1.00000 1.000000 1.00000
2 rowMads_X_S 1.035385 1.035427 1.067036 1.03548 1.035838 1.21198

Figure: Benchmarking of colMads_X_S() and rowMads_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 5222542 279.0    8529671 455.6  8529671 455.6
Vcells 9657625  73.7   31876688 243.2 60562128 462.1
> colStats <- microbenchmark(colMads_X_S = colMads(X_S, na.rm = FALSE), `colMads(X, rows, cols)` = colMads(X, 
+     rows = rows, cols = cols, na.rm = FALSE), `colMads(X[rows, cols])` = colMads(X[rows, cols], na.rm = FALSE), 
+     unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
          used  (Mb) gc trigger  (Mb) max used  (Mb)
Ncells 5222518 279.0    8529671 455.6  8529671 455.6
Vcells 9662678  73.8   31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowMads_X_S = rowMads(X_S, na.rm = FALSE), `rowMads(X, cols, rows)` = rowMads(X, 
+     rows = cols, cols = rows, na.rm = FALSE), `rowMads(X[cols, rows])` = rowMads(X[cols, rows], na.rm = FALSE), 
+     unit = "ms")

Table: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(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
2 colMads(X, rows, cols) 0.097614 0.1059500 0.1156218 0.1127260 0.1201080 0.166373
1 colMads_X_S 0.094198 0.1038435 0.1150566 0.1131975 0.1245320 0.180748
3 colMads(X[rows, cols]) 0.107073 0.1175900 0.1261233 0.1231830 0.1342685 0.166177
  expr min lq mean median uq max
2 colMads(X, rows, cols) 1.000000 1.000000 1.0000000 1.000000 1.000000 1.0000000
1 colMads_X_S 0.965005 0.980118 0.9951123 1.004183 1.036833 1.0864022
3 colMads(X[rows, cols]) 1.096902 1.109863 1.0908267 1.092765 1.117898 0.9988219

Table: Benchmarking of rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(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
2 rowMads(X, cols, rows) 0.102962 0.1091030 0.1166636 0.1124835 0.1200705 0.195332
1 rowMads_X_S 0.107028 0.1115420 0.1203751 0.1161365 0.1277905 0.155609
3 rowMads(X[cols, rows]) 0.116490 0.1212795 0.1314804 0.1262820 0.1395350 0.187189
  expr min lq mean median uq max
2 rowMads(X, cols, rows) 1.000000 1.000000 1.000000 1.000000 1.000000 1.0000000
1 rowMads_X_S 1.039490 1.022355 1.031813 1.032476 1.064296 0.7966385
3 rowMads(X[cols, rows]) 1.131388 1.111606 1.127004 1.122671 1.162109 0.9583120

Figure: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(X[rows, cols])() on integer+10x1000 data as well as rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colMads_X_S() and rowMads_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
1 colMads_X_S 94.198 103.8435 115.0566 113.1975 124.5320 180.748
2 rowMads_X_S 107.028 111.5420 120.3751 116.1365 127.7905 155.609
  expr min lq mean median uq max
1 colMads_X_S 1.000000 1.000000 1.000000 1.000000 1.000000 1.0000000
2 rowMads_X_S 1.136203 1.074136 1.046225 1.025964 1.026166 0.8609169

Figure: Benchmarking of colMads_X_S() and rowMads_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 5222755 279.0    8529671 455.6  8529671 455.6
Vcells 9680296  73.9   31876688 243.2 60562128 462.1
> colStats <- microbenchmark(colMads_X_S = colMads(X_S, na.rm = FALSE), `colMads(X, rows, cols)` = colMads(X, 
+     rows = rows, cols = cols, na.rm = FALSE), `colMads(X[rows, cols])` = colMads(X[rows, cols], na.rm = FALSE), 
+     unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
          used  (Mb) gc trigger  (Mb) max used  (Mb)
Ncells 5222731 279.0    8529671 455.6  8529671 455.6
Vcells 9730349  74.3   31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowMads_X_S = rowMads(X_S, na.rm = FALSE), `rowMads(X, cols, rows)` = rowMads(X, 
+     rows = cols, cols = rows, na.rm = FALSE), `rowMads(X[cols, rows])` = rowMads(X[cols, rows], na.rm = FALSE), 
+     unit = "ms")

Table: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(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 colMads_X_S 1.417719 1.630202 1.691884 1.665612 1.692498 2.364768
2 colMads(X, rows, cols) 1.483859 1.632983 1.737114 1.687781 1.754010 2.278443
3 colMads(X[rows, cols]) 1.498354 1.715013 1.818983 1.776871 1.818416 2.565856
  expr min lq mean median uq max
1 colMads_X_S 1.000000 1.000000 1.000000 1.000000 1.000000 1.0000000
2 colMads(X, rows, cols) 1.046652 1.001706 1.026734 1.013310 1.036344 0.9634954
3 colMads(X[rows, cols]) 1.056877 1.052024 1.075123 1.066798 1.074397 1.0850350

Table: Benchmarking of rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(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
2 rowMads(X, cols, rows) 1.506947 1.553424 1.652926 1.599171 1.653604 2.224853
1 rowMads_X_S 1.564443 1.585908 1.705902 1.634154 1.723385 2.317330
3 rowMads(X[cols, rows]) 1.632498 1.655447 1.795700 1.700440 1.755014 4.476681
  expr min lq mean median uq max
2 rowMads(X, cols, rows) 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 rowMads_X_S 1.038154 1.020911 1.032050 1.021876 1.042199 1.041565
3 rowMads(X[cols, rows]) 1.083315 1.065676 1.086377 1.063326 1.061327 2.012124

Figure: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(X[rows, cols])() on integer+100x1000 data as well as rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colMads_X_S() and rowMads_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 rowMads_X_S 1.564443 1.585908 1.705902 1.634154 1.723385 2.317330
1 colMads_X_S 1.417719 1.630202 1.691884 1.665612 1.692498 2.364768
  expr min lq mean median uq max
2 rowMads_X_S 1.0000000 1.00000 1.0000000 1.00000 1.000000 1.000000
1 colMads_X_S 0.9062133 1.02793 0.9917825 1.01925 0.982078 1.020471

Figure: Benchmarking of colMads_X_S() and rowMads_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 5222965 279.0    8529671 455.6  8529671 455.6
Vcells 9681071  73.9   31876688 243.2 60562128 462.1
> colStats <- microbenchmark(colMads_X_S = colMads(X_S, na.rm = FALSE), `colMads(X, rows, cols)` = colMads(X, 
+     rows = rows, cols = cols, na.rm = FALSE), `colMads(X[rows, cols])` = colMads(X[rows, cols], na.rm = FALSE), 
+     unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
          used  (Mb) gc trigger  (Mb) max used  (Mb)
Ncells 5222941 279.0    8529671 455.6  8529671 455.6
Vcells 9731124  74.3   31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowMads_X_S = rowMads(X_S, na.rm = FALSE), `rowMads(X, cols, rows)` = rowMads(X, 
+     rows = cols, cols = rows, na.rm = FALSE), `rowMads(X[cols, rows])` = rowMads(X[cols, rows], na.rm = FALSE), 
+     unit = "ms")

Table: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(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
2 colMads(X, rows, cols) 1.085066 1.149720 1.208804 1.185625 1.226300 1.643439
1 colMads_X_S 1.089497 1.184171 1.214995 1.198657 1.223488 1.847442
3 colMads(X[rows, cols]) 1.154745 1.205556 1.264744 1.261588 1.296334 1.804970
  expr min lq mean median uq max
2 colMads(X, rows, cols) 1.000000 1.000000 1.000000 1.000000 1.0000000 1.000000
1 colMads_X_S 1.004084 1.029964 1.005122 1.010991 0.9977069 1.124132
3 colMads(X[rows, cols]) 1.064216 1.048564 1.046277 1.064070 1.0571104 1.098288

Table: Benchmarking of rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(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
2 rowMads(X, cols, rows) 1.105407 1.170870 1.214940 1.201795 1.207318 1.882349
1 rowMads_X_S 1.127465 1.203342 1.238002 1.229418 1.237796 1.591996
3 rowMads(X[cols, rows]) 1.198161 1.268891 1.305387 1.301751 1.312086 1.874509
  expr min lq mean median uq max
2 rowMads(X, cols, rows) 1.000000 1.000000 1.000000 1.000000 1.000000 1.0000000
1 rowMads_X_S 1.019955 1.027733 1.018981 1.022984 1.025245 0.8457496
3 rowMads(X[cols, rows]) 1.083909 1.083716 1.074445 1.083172 1.086778 0.9958350

Figure: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(X[rows, cols])() on integer+1000x100 data as well as rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colMads_X_S() and rowMads_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
1 colMads_X_S 1.089497 1.184171 1.214995 1.198657 1.223488 1.847442
2 rowMads_X_S 1.127465 1.203342 1.238002 1.229418 1.237796 1.591996
  expr min lq mean median uq max
1 colMads_X_S 1.000000 1.00000 1.000000 1.000000 1.000000 1.0000000
2 rowMads_X_S 1.034849 1.01619 1.018935 1.025663 1.011695 0.8617299

Figure: Benchmarking of colMads_X_S() and rowMads_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 5223183 279.0    8529671 455.6  8529671 455.6
Vcells 9772162  74.6   31876688 243.2 60562128 462.1
> colStats <- microbenchmark(colMads_X_S = colMads(X_S, na.rm = FALSE), `colMads(X, rows, cols)` = colMads(X, 
+     rows = rows, cols = cols, na.rm = FALSE), `colMads(X[rows, cols])` = colMads(X[rows, cols], na.rm = FALSE), 
+     unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
          used  (Mb) gc trigger  (Mb) max used  (Mb)
Ncells 5223150 279.0    8529671 455.6  8529671 455.6
Vcells 9772300  74.6   31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowMads_X_S = rowMads(X_S, na.rm = FALSE), `rowMads(X, cols, rows)` = rowMads(X, 
+     rows = cols, cols = rows, na.rm = FALSE), `rowMads(X[cols, rows])` = rowMads(X[cols, rows], na.rm = FALSE), 
+     unit = "ms")

Table: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(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 colMads_X_S 0.003726 0.0038045 0.0042544 0.0038940 0.0040430 0.026198
2 colMads(X, rows, cols) 0.004155 0.0043660 0.0046214 0.0044525 0.0045435 0.011127
3 colMads(X[rows, cols]) 0.004658 0.0049150 0.0051246 0.0050410 0.0051965 0.011186
  expr min lq mean median uq max
1 colMads_X_S 1.000000 1.000000 1.000000 1.000000 1.000000 1.0000000
2 colMads(X, rows, cols) 1.115137 1.147588 1.086266 1.143426 1.123794 0.4247271
3 colMads(X[rows, cols]) 1.250134 1.291891 1.204549 1.294556 1.285308 0.4269792

Table: Benchmarking of rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(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 rowMads_X_S 0.003594 0.0036745 0.0038523 0.0038010 0.0039325 0.006779
2 rowMads(X, cols, rows) 0.003975 0.0042030 0.0045456 0.0043055 0.0044020 0.024302
3 rowMads(X[cols, rows]) 0.004466 0.0047335 0.0050846 0.0048645 0.0049875 0.019734
  expr min lq mean median uq max
1 rowMads_X_S 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
2 rowMads(X, cols, rows) 1.106010 1.143829 1.179974 1.132728 1.119390 3.584894
3 rowMads(X[cols, rows]) 1.242627 1.288202 1.319877 1.279795 1.268277 2.911049

Figure: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(X[rows, cols])() on double+10x10 data as well as rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colMads_X_S() and rowMads_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 rowMads_X_S 3.594 3.6745 3.85229 3.801 3.9325 6.779
1 colMads_X_S 3.726 3.8045 4.25439 3.894 4.0430 26.198
  expr min lq mean median uq max
2 rowMads_X_S 1.000000 1.000000 1.00000 1.000000 1.000000 1.000000
1 colMads_X_S 1.036728 1.035379 1.10438 1.024467 1.028099 3.864582

Figure: Benchmarking of colMads_X_S() and rowMads_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 5223381 279.0    8529671 455.6  8529671 455.6
Vcells 9778099  74.7   31876688 243.2 60562128 462.1
> colStats <- microbenchmark(colMads_X_S = colMads(X_S, na.rm = FALSE), `colMads(X, rows, cols)` = colMads(X, 
+     rows = rows, cols = cols, na.rm = FALSE), `colMads(X[rows, cols])` = colMads(X[rows, cols], na.rm = FALSE), 
+     unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
          used  (Mb) gc trigger  (Mb) max used  (Mb)
Ncells 5223357 279.0    8529671 455.6  8529671 455.6
Vcells 9788152  74.7   31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowMads_X_S = rowMads(X_S, na.rm = FALSE), `rowMads(X, cols, rows)` = rowMads(X, 
+     rows = cols, cols = rows, na.rm = FALSE), `rowMads(X[cols, rows])` = rowMads(X[cols, rows], na.rm = FALSE), 
+     unit = "ms")

Table: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(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 colMads_X_S 0.185069 0.1922325 0.2081775 0.2033905 0.2202775 0.252736
2 colMads(X, rows, cols) 0.185441 0.1947715 0.2096435 0.2038805 0.2210425 0.280302
3 colMads(X[rows, cols]) 0.195130 0.2025730 0.2222310 0.2150940 0.2420335 0.303092
  expr min lq mean median uq max
1 colMads_X_S 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
2 colMads(X, rows, cols) 1.002010 1.013208 1.007042 1.002409 1.003473 1.109070
3 colMads(X[rows, cols]) 1.054364 1.053792 1.067507 1.057542 1.098766 1.199243

Table: Benchmarking of rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(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 rowMads_X_S 0.183997 0.1996895 0.2176960 0.212422 0.2309220 0.317659
2 rowMads(X, cols, rows) 0.185518 0.2023970 0.2163835 0.215181 0.2294845 0.281491
3 rowMads(X[cols, rows]) 0.194266 0.2109260 0.2262418 0.223656 0.2390645 0.300976
  expr min lq mean median uq max
1 rowMads_X_S 1.000000 1.000000 1.0000000 1.000000 1.000000 1.0000000
2 rowMads(X, cols, rows) 1.008266 1.013559 0.9939712 1.012988 0.993775 0.8861421
3 rowMads(X[cols, rows]) 1.055811 1.056270 1.0392560 1.052885 1.035261 0.9474814

Figure: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(X[rows, cols])() on double+100x100 data as well as rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colMads_X_S() and rowMads_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
1 colMads_X_S 185.069 192.2325 208.1775 203.3905 220.2775 252.736
2 rowMads_X_S 183.997 199.6895 217.6960 212.4220 230.9220 317.659
  expr min lq mean median uq max
1 colMads_X_S 1.0000000 1.000000 1.000000 1.000000 1.000000 1.000000
2 rowMads_X_S 0.9942076 1.038792 1.045723 1.044405 1.048323 1.256881

Figure: Benchmarking of colMads_X_S() and rowMads_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 5223580 279.0    8529671 455.6  8529671 455.6
Vcells 9779494  74.7   31876688 243.2 60562128 462.1
> colStats <- microbenchmark(colMads_X_S = colMads(X_S, na.rm = FALSE), `colMads(X, rows, cols)` = colMads(X, 
+     rows = rows, cols = cols, na.rm = FALSE), `colMads(X[rows, cols])` = colMads(X[rows, cols], na.rm = FALSE), 
+     unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
          used  (Mb) gc trigger  (Mb) max used  (Mb)
Ncells 5223556 279.0    8529671 455.6  8529671 455.6
Vcells 9789547  74.7   31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowMads_X_S = rowMads(X_S, na.rm = FALSE), `rowMads(X, cols, rows)` = rowMads(X, 
+     rows = cols, cols = rows, na.rm = FALSE), `rowMads(X[cols, rows])` = rowMads(X[cols, rows], na.rm = FALSE), 
+     unit = "ms")

Table: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(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
2 colMads(X, rows, cols) 0.175997 0.1773025 0.2077430 0.1962025 0.2291455 0.291108
3 colMads(X[rows, cols]) 0.183437 0.1847305 0.2166757 0.2032115 0.2393360 0.332860
1 colMads_X_S 0.172278 0.1781660 0.2096855 0.2047495 0.2254340 0.284149
  expr min lq mean median uq max
2 colMads(X, rows, cols) 1.000000 1.000000 1.000000 1.000000 1.0000000 1.0000000
3 colMads(X[rows, cols]) 1.042273 1.041894 1.042999 1.035723 1.0444717 1.1434244
1 colMads_X_S 0.978869 1.004870 1.009351 1.043562 0.9838029 0.9760948

Table: Benchmarking of rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(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 rowMads_X_S 0.172019 0.1766200 0.2047788 0.1916175 0.2220000 0.293810
2 rowMads(X, cols, rows) 0.175103 0.1777085 0.2124895 0.2085635 0.2366575 0.289278
3 rowMads(X[cols, rows]) 0.183978 0.1897030 0.2214018 0.2181130 0.2410750 0.340425
  expr min lq mean median uq max
1 rowMads_X_S 1.000000 1.000000 1.000000 1.000000 1.000000 1.0000000
2 rowMads(X, cols, rows) 1.017928 1.006163 1.037654 1.088437 1.066025 0.9845751
3 rowMads(X[cols, rows]) 1.069521 1.074074 1.081175 1.138273 1.085923 1.1586570

Figure: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(X[rows, cols])() on double+1000x10 data as well as rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colMads_X_S() and rowMads_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 rowMads_X_S 172.019 176.620 204.7788 191.6175 222.000 293.810
1 colMads_X_S 172.278 178.166 209.6855 204.7495 225.434 284.149
  expr min lq mean median uq max
2 rowMads_X_S 1.000000 1.000000 1.000000 1.000000 1.000000 1.0000000
1 colMads_X_S 1.001506 1.008753 1.023961 1.068532 1.015469 0.9671182

Figure: Benchmarking of colMads_X_S() and rowMads_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 5223784 279.0    8529671 455.6  8529671 455.6
Vcells 9779629  74.7   31876688 243.2 60562128 462.1
> colStats <- microbenchmark(colMads_X_S = colMads(X_S, na.rm = FALSE), `colMads(X, rows, cols)` = colMads(X, 
+     rows = rows, cols = cols, na.rm = FALSE), `colMads(X[rows, cols])` = colMads(X[rows, cols], na.rm = FALSE), 
+     unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
          used  (Mb) gc trigger  (Mb) max used  (Mb)
Ncells 5223760 279.0    8529671 455.6  8529671 455.6
Vcells 9789682  74.7   31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowMads_X_S = rowMads(X_S, na.rm = FALSE), `rowMads(X, cols, rows)` = rowMads(X, 
+     rows = cols, cols = rows, na.rm = FALSE), `rowMads(X[cols, rows])` = rowMads(X[cols, rows], na.rm = FALSE), 
+     unit = "ms")

Table: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(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
2 colMads(X, rows, cols) 0.141589 0.1505660 0.1690891 0.1650760 0.1825165 0.246319
1 colMads_X_S 0.138516 0.1474945 0.1739136 0.1754285 0.1910490 0.262605
3 colMads(X[rows, cols]) 0.151591 0.1656825 0.1886651 0.1861745 0.2011445 0.290701
  expr min lq mean median uq max
2 colMads(X, rows, cols) 1.0000000 1.0000000 1.000000 1.000000 1.000000 1.000000
1 colMads_X_S 0.9782963 0.9796003 1.028532 1.062714 1.046749 1.066118
3 colMads(X[rows, cols]) 1.0706411 1.1003978 1.115773 1.127811 1.102062 1.180181

Table: Benchmarking of rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(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 rowMads_X_S 0.137422 0.1501845 0.1723559 0.1694125 0.185415 0.236189
2 rowMads(X, cols, rows) 0.140753 0.1505595 0.1718368 0.1725220 0.182812 0.271620
3 rowMads(X[cols, rows]) 0.148459 0.1593680 0.1851883 0.1840025 0.201822 0.248958
  expr min lq mean median uq max
1 rowMads_X_S 1.000000 1.000000 1.000000 1.000000 1.0000000 1.000000
2 rowMads(X, cols, rows) 1.024239 1.002497 0.996988 1.018355 0.9859612 1.150011
3 rowMads(X[cols, rows]) 1.080315 1.061148 1.074453 1.086121 1.0884880 1.054063

Figure: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(X[rows, cols])() on double+10x1000 data as well as rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colMads_X_S() and rowMads_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 rowMads_X_S 137.422 150.1845 172.3559 169.4125 185.415 236.189
1 colMads_X_S 138.516 147.4945 173.9135 175.4285 191.049 262.605
  expr min lq mean median uq max
2 rowMads_X_S 1.000000 1.0000000 1.000000 1.000000 1.000000 1.000000
1 colMads_X_S 1.007961 0.9820887 1.009038 1.035511 1.030386 1.111843

Figure: Benchmarking of colMads_X_S() and rowMads_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 5223997  279    8529671 455.6  8529671 455.6
Vcells 9825073   75   31876688 243.2 60562128 462.1
> colStats <- microbenchmark(colMads_X_S = colMads(X_S, na.rm = FALSE), `colMads(X, rows, cols)` = colMads(X, 
+     rows = rows, cols = cols, na.rm = FALSE), `colMads(X[rows, cols])` = colMads(X[rows, cols], na.rm = FALSE), 
+     unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
          used  (Mb) gc trigger  (Mb) max used  (Mb)
Ncells 5223973 279.0    8529671 455.6  8529671 455.6
Vcells 9925126  75.8   31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowMads_X_S = rowMads(X_S, na.rm = FALSE), `rowMads(X, cols, rows)` = rowMads(X, 
+     rows = cols, cols = rows, na.rm = FALSE), `rowMads(X[cols, rows])` = rowMads(X[cols, rows], na.rm = FALSE), 
+     unit = "ms")

Table: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(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 colMads_X_S 1.875287 2.024370 2.060110 2.032348 2.040499 3.241494
2 colMads(X, rows, cols) 1.872633 2.021563 2.045685 2.033446 2.038120 3.172565
3 colMads(X[rows, cols]) 1.969665 2.132613 2.175704 2.138631 2.146966 3.166726
  expr min lq mean median uq max
1 colMads_X_S 1.0000000 1.0000000 1.000000 1.000000 1.0000000 1.0000000
2 colMads(X, rows, cols) 0.9985847 0.9986131 0.992998 1.000540 0.9988339 0.9787354
3 colMads(X[rows, cols]) 1.0503272 1.0534695 1.056111 1.052296 1.0521772 0.9769341

Table: Benchmarking of rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(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 rowMads_X_S 1.863827 2.015923 2.076716 2.021421 2.054693 3.223811
2 rowMads(X, cols, rows) 1.882677 2.040559 2.054763 2.045401 2.058898 2.997697
3 rowMads(X[cols, rows]) 1.972272 2.126524 2.168128 2.134272 2.152099 2.893971
  expr min lq mean median uq max
1 rowMads_X_S 1.000000 1.000000 1.0000000 1.000000 1.000000 1.0000000
2 rowMads(X, cols, rows) 1.010114 1.012221 0.9894288 1.011863 1.002047 0.9298613
3 rowMads(X[cols, rows]) 1.058184 1.054864 1.0440176 1.055828 1.047407 0.8976863

Figure: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(X[rows, cols])() on double+100x1000 data as well as rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colMads_X_S() and rowMads_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
2 rowMads_X_S 1.863827 2.015923 2.076716 2.021421 2.054693 3.223811
1 colMads_X_S 1.875287 2.024370 2.060110 2.032348 2.040499 3.241494
  expr min lq mean median uq max
2 rowMads_X_S 1.000000 1.00000 1.0000000 1.000000 1.0000000 1.000000
1 colMads_X_S 1.006149 1.00419 0.9920035 1.005406 0.9930919 1.005485

Figure: Benchmarking of colMads_X_S() and rowMads_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 5224207 279.1    8529671 455.6  8529671 455.6
Vcells 9825214  75.0   31876688 243.2 60562128 462.1
> colStats <- microbenchmark(colMads_X_S = colMads(X_S, na.rm = FALSE), `colMads(X, rows, cols)` = colMads(X, 
+     rows = rows, cols = cols, na.rm = FALSE), `colMads(X[rows, cols])` = colMads(X[rows, cols], na.rm = FALSE), 
+     unit = "ms")
> X <- t(X)
> X_S <- t(X_S)
> gc()
          used  (Mb) gc trigger  (Mb) max used  (Mb)
Ncells 5224183 279.1    8529671 455.6  8529671 455.6
Vcells 9925267  75.8   31876688 243.2 60562128 462.1
> rowStats <- microbenchmark(rowMads_X_S = rowMads(X_S, na.rm = FALSE), `rowMads(X, cols, rows)` = rowMads(X, 
+     rows = cols, cols = rows, na.rm = FALSE), `rowMads(X[cols, rows])` = rowMads(X[cols, rows], na.rm = FALSE), 
+     unit = "ms")

Table: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(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 colMads_X_S 1.706926 1.850517 1.887975 1.854982 1.903505 2.812716
2 colMads(X, rows, cols) 1.714144 1.852256 1.896291 1.859166 1.911118 2.640585
3 colMads(X[rows, cols]) 1.801265 1.944529 1.966103 1.956179 2.001884 2.847237
  expr min lq mean median uq max
1 colMads_X_S 1.000000 1.000000 1.000000 1.000000 1.000000 1.0000000
2 colMads(X, rows, cols) 1.004229 1.000940 1.004405 1.002255 1.003999 0.9388026
3 colMads(X[rows, cols]) 1.055268 1.050803 1.041382 1.054554 1.051683 1.0122732

Table: Benchmarking of rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(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 rowMads_X_S 1.701636 1.838294 1.866937 1.846607 1.897780 2.446870
2 rowMads(X, cols, rows) 1.723853 1.863206 1.907139 1.871997 1.912233 2.926454
3 rowMads(X[cols, rows]) 1.802261 1.950943 1.978890 1.961919 2.003583 2.957204
  expr min lq mean median uq max
1 rowMads_X_S 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
2 rowMads(X, cols, rows) 1.013056 1.013552 1.021534 1.013750 1.007616 1.195999
3 rowMads(X[cols, rows]) 1.059134 1.061280 1.059966 1.062445 1.055751 1.208566

Figure: Benchmarking of colMads_X_S(), colMads(X, rows, cols)() and colMads(X[rows, cols])() on double+1000x100 data as well as rowMads_X_S(), rowMads(X, cols, rows)() and rowMads(X[cols, rows])() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colMads_X_S() and rowMads_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
2 rowMads_X_S 1.701636 1.838294 1.866937 1.846607 1.897780 2.446870
1 colMads_X_S 1.706926 1.850517 1.887975 1.854982 1.903505 2.812716
  expr min lq mean median uq max
2 rowMads_X_S 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 colMads_X_S 1.003109 1.006649 1.011269 1.004536 1.003017 1.149516

Figure: Benchmarking of colMads_X_S() and rowMads_X_S() on double+1000x100 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

Appendix

Session information

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 26.63 secs.

Reproducibility

To reproduce this report, do:

html <- matrixStats:::benchmark('colRowMads_subset')

Copyright Dongcan Jiang. Last updated on 2021-08-25 18:56:41 (+0200 UTC). Powered by RSP.