matrixStats.benchmarks


colCounts() and rowCounts() benchmarks

This report benchmark the performance of colCounts() and rowCounts() against alternative methods.

Alternative methods

Data type “logical”

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 matrix

> X <- data[["10x10"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() on logical+10x10 data. The top panel shows times in milliseconds and the bottom panel shows relative times.

  expr min lq mean median uq max
2 colSums 0.006501 0.0073220 0.0083084 0.0081615 0.0088265 0.027202
1 colCounts 0.008136 0.0089050 0.0104627 0.0097525 0.0110085 0.048968
3 apply+sum 0.040800 0.0431555 0.0452735 0.0439785 0.0452470 0.115865
  expr min lq mean median uq max
2 colSums 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 colCounts 1.251500 1.216198 1.259291 1.194940 1.247210 1.800162
3 apply+sum 6.275957 5.893950 5.449132 5.388532 5.126267 4.259430

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() on logical+10x10 data (transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.

  expr min lq mean median uq max
2 rowSums 0.007394 0.0080365 0.0088441 0.0087190 0.009276 0.019050
1 rowCounts 0.007041 0.0076265 0.0090828 0.0092620 0.009751 0.034029
3 apply+sum 0.041004 0.0426325 0.0455665 0.0433915 0.044400 0.112803
  expr min lq mean median uq max
2 rowSums 1.0000000 1.0000000 1.000000 1.000000 1.000000 1.000000
1 rowCounts 0.9522586 0.9489828 1.026994 1.062278 1.051207 1.786299
3 apply+sum 5.5455775 5.3048591 5.152195 4.976660 4.786546 5.921417

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on logical+10x10 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() on logical+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 rowCounts 7.041 7.6265 9.08284 9.2620 9.7510 34.029
1 colCounts 8.136 8.9050 10.46268 9.7525 11.0085 48.968
  expr min lq mean median uq max
2 rowCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 colCounts 1.155518 1.167639 1.151917 1.052958 1.128961 1.439008

Figure: Benchmarking of colCounts() and rowCounts() on logical+10x10 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

100x100 matrix

> X <- data[["100x100"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() on logical+100x100 data. The top panel shows times in milliseconds and the bottom panel shows relative times.

  expr min lq mean median uq max
2 colSums 0.036407 0.0398030 0.0440769 0.0424175 0.0465420 0.070074
1 colCounts 0.076051 0.0824960 0.0916281 0.0872825 0.1008040 0.160833
3 apply+sum 0.269949 0.2900645 0.3206545 0.3039580 0.3385325 0.490250
  expr min lq mean median uq max
2 colSums 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 colCounts 2.088912 2.072608 2.078826 2.057700 2.165872 2.295188
3 apply+sum 7.414755 7.287503 7.274895 7.165863 7.273699 6.996175

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() on logical+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 rowSums 0.062661 0.0684775 0.0761178 0.0720920 0.0824805 0.115206
1 rowCounts 0.070389 0.0795345 0.0875144 0.0834775 0.0965375 0.132294
3 apply+sum 0.262021 0.2856800 0.3240388 0.3087325 0.3536190 0.539589
  expr min lq mean median uq max
2 rowSums 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 rowCounts 1.123330 1.161469 1.149722 1.157930 1.170428 1.148326
3 apply+sum 4.181564 4.171881 4.257068 4.282479 4.287304 4.683688

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on logical+100x100 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() on logical+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 rowCounts 70.389 79.5345 87.51437 83.4775 96.5375 132.294
1 colCounts 76.051 82.4960 91.62811 87.2825 100.8040 160.833
  expr min lq mean median uq max
2 rowCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 colCounts 1.080439 1.037235 1.047006 1.045581 1.044195 1.215724

Figure: Benchmarking of colCounts() and rowCounts() on logical+100x100 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

1000x10 matrix

> X <- data[["1000x10"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() on logical+1000x10 data. The top panel shows times in milliseconds and the bottom panel shows relative times.

  expr min lq mean median uq max
2 colSums 0.039955 0.0415010 0.0463280 0.0447725 0.0496180 0.113803
1 colCounts 0.081870 0.0857645 0.0964906 0.0953415 0.1049435 0.151107
3 apply+sum 0.141418 0.1455040 0.1668182 0.1626485 0.1817585 0.278370
  expr min lq mean median uq max
2 colSums 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 colCounts 2.049055 2.066565 2.082772 2.129466 2.115029 1.327794
3 apply+sum 3.539432 3.506036 3.600811 3.632777 3.663156 2.446069

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() on logical+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 rowCounts 0.070871 0.0861760 0.0941584 0.091879 0.1038375 0.141825
3 apply+sum 0.122591 0.1336110 0.1493851 0.144210 0.1591510 0.244967
2 rowSums 0.170026 0.1906035 0.2066102 0.199714 0.2238580 0.280389
  expr min lq mean median uq max
1 rowCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
3 apply+sum 1.729777 1.550443 1.586530 1.569564 1.532693 1.727248
2 rowSums 2.399091 2.211793 2.194284 2.173663 2.155849 1.977007

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on logical+1000x10 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() on logical+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 rowCounts 70.871 86.1760 94.15836 91.8790 103.8375 141.825
1 colCounts 81.870 85.7645 96.49059 95.3415 104.9435 151.107
  expr min lq mean median uq max
2 rowCounts 1.000000 1.0000000 1.000000 1.000000 1.000000 1.000000
1 colCounts 1.155198 0.9952249 1.024769 1.037685 1.010651 1.065447

Figure: Benchmarking of colCounts() and rowCounts() on logical+1000x10 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

10x1000 matrix

> X <- data[["10x1000"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() on logical+10x1000 data. The top panel shows times in milliseconds and the bottom panel shows relative times.

  expr min lq mean median uq max
2 colSums 0.030777 0.033685 0.0380735 0.036006 0.039692 0.086183
1 colCounts 0.072744 0.078724 0.0877118 0.083235 0.088893 0.153550
3 apply+sum 1.352990 1.447261 1.5418828 1.506645 1.608526 2.154248
  expr min lq mean median uq max
2 colSums 1.000000 1.000000 1.000000 1.000000 1.00000 1.000000
1 colCounts 2.363583 2.337064 2.303748 2.311698 2.23957 1.781674
3 apply+sum 43.961075 42.964554 40.497512 41.844276 40.52521 24.996206

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() on logical+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 rowSums 0.045650 0.0505585 0.0563910 0.0534225 0.0594085 0.100107
1 rowCounts 0.062051 0.0702600 0.0813624 0.0757050 0.0881570 0.141772
3 apply+sum 1.344391 1.4742460 1.5905001 1.5300320 1.6568185 2.176518
  expr min lq mean median uq max
2 rowSums 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 rowCounts 1.359277 1.389677 1.442827 1.417099 1.483912 1.416205
3 apply+sum 29.449967 29.159212 28.204862 28.640217 27.888577 21.741916

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on logical+10x1000 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() on logical+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 rowCounts 62.051 70.260 81.36245 75.705 88.157 141.772
1 colCounts 72.744 78.724 87.71178 83.235 88.893 153.550
  expr min lq mean median uq max
2 rowCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 colCounts 1.172326 1.120467 1.078038 1.099465 1.008349 1.083077

Figure: Benchmarking of colCounts() and rowCounts() on logical+10x1000 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

100x1000 matrix

> X <- data[["100x1000"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() on logical+100x1000 data. The top panel shows times in milliseconds and the bottom panel shows relative times.

  expr min lq mean median uq max
2 colSums 0.261205 0.2856225 0.4783527 0.2945520 0.3105435 17.695614
1 colCounts 0.600921 0.6491945 0.6698462 0.6678425 0.6782875 0.925825
3 apply+sum 2.150766 2.3229135 2.4447240 2.4007440 2.4493115 3.797806
  expr min lq mean median uq max
2 colSums 1.000000 1.000000 1.000000 1.000000 1.000000 1.0000000
1 colCounts 2.300572 2.272911 1.400319 2.267316 2.184195 0.0523195
3 apply+sum 8.234015 8.132810 5.110714 8.150493 7.887177 0.2146185

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() on logical+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 rowSums 0.405189 0.438964 0.4550076 0.4535765 0.4643900 0.556336
1 rowCounts 0.572433 0.628539 0.6556373 0.6439620 0.6534015 0.984505
3 apply+sum 2.151278 2.330856 2.6260043 2.3835415 2.4454930 19.961024
  expr min lq mean median uq max
2 rowSums 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 rowCounts 1.412756 1.431869 1.440937 1.419743 1.407010 1.769623
3 apply+sum 5.309320 5.309902 5.771342 5.254993 5.266033 35.879440

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on logical+100x1000 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() on logical+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 rowCounts 572.433 628.5390 655.6373 643.9620 653.4015 984.505
1 colCounts 600.921 649.1945 669.8462 667.8425 678.2875 925.825
  expr min lq mean median uq max
2 rowCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.0000000
1 colCounts 1.049767 1.032863 1.021672 1.037084 1.038087 0.9403964

Figure: Benchmarking of colCounts() and rowCounts() on logical+100x1000 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

1000x100 matrix

> X <- data[["1000x100"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() on logical+1000x100 data. The top panel shows times in milliseconds and the bottom panel shows relative times.

  expr min lq mean median uq max
2 colSums 0.264316 0.2752995 0.2935237 0.2865115 0.2981235 0.401451
1 colCounts 0.592004 0.6237240 0.6820136 0.6446900 0.7149680 1.010604
3 apply+sum 0.932985 0.9867185 1.1448083 1.0285045 1.1287550 8.547166
  expr min lq mean median uq max
2 colSums 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 colCounts 2.239759 2.265620 2.323538 2.250137 2.398228 2.517378
3 apply+sum 3.529809 3.584164 3.900224 3.589749 3.786199 21.290683

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() on logical+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 rowSums 0.505743 0.5476215 0.5771170 0.5536975 0.5746035 0.922504
1 rowCounts 0.578038 0.6270185 0.6690668 0.6403885 0.6807910 1.010234
3 apply+sum 0.940992 1.0089565 1.1637090 1.0268850 1.1337085 8.836396
  expr min lq mean median uq max
2 rowSums 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 rowCounts 1.142948 1.144985 1.159326 1.156567 1.184801 1.095100
3 apply+sum 1.860613 1.842434 2.016418 1.854596 1.973027 9.578708

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on logical+1000x100 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() on logical+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 rowCounts 578.038 627.0185 669.0668 640.3885 680.791 1010.234
1 colCounts 592.004 623.7240 682.0136 644.6900 714.968 1010.604
  expr min lq mean median uq max
2 rowCounts 1.000000 1.0000000 1.000000 1.000000 1.000000 1.000000
1 colCounts 1.024161 0.9947458 1.019351 1.006717 1.050202 1.000366

Figure: Benchmarking of colCounts() and rowCounts() on logical+1000x100 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

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 matrix

> X <- data[["10x10"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() 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
2 colSums 0.006626 0.007294 0.0085629 0.0082660 0.0089155 0.021699
1 colCounts 0.008518 0.008998 0.0105554 0.0099655 0.0112540 0.038060
3 apply+sum 0.041677 0.043320 0.0453861 0.0442305 0.0452055 0.117208
  expr min lq mean median uq max
2 colSums 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 colCounts 1.285542 1.233617 1.232699 1.205601 1.262296 1.753998
3 apply+sum 6.289918 5.939128 5.300329 5.350895 5.070439 5.401539

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() 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
2 rowSums 0.007367 0.0082515 0.0090520 0.0089205 0.0095640 0.020015
1 rowCounts 0.007200 0.0077835 0.0093122 0.0093590 0.0098685 0.034042
3 apply+sum 0.041930 0.0432210 0.0460938 0.0442305 0.0465350 0.120707
  expr min lq mean median uq max
2 rowSums 1.0000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 rowCounts 0.9773313 0.943283 1.028749 1.049156 1.031838 1.700824
3 apply+sum 5.6915977 5.237957 5.092116 4.958298 4.865642 6.030827

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on integer+10x10 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() 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 rowCounts 7.200 7.7835 9.31224 9.3590 9.8685 34.042
1 colCounts 8.518 8.9980 10.55545 9.9655 11.2540 38.060
  expr min lq mean median uq max
2 rowCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 colCounts 1.183056 1.156035 1.133503 1.064804 1.140396 1.118031

Figure: Benchmarking of colCounts() and rowCounts() on integer+10x10 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

100x100 matrix

> X <- data[["100x100"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() 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 colSums 0.037768 0.0405210 0.0458021 0.0444525 0.0496990 0.093093
1 colCounts 0.042724 0.0475290 0.0533364 0.0509165 0.0578555 0.109744
3 apply+sum 0.264001 0.2859985 0.3263118 0.3046985 0.3565860 0.593220
  expr min lq mean median uq max
2 colSums 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 colCounts 1.131222 1.172947 1.164496 1.145414 1.164118 1.178864
3 apply+sum 6.990071 7.058032 7.124382 6.854474 7.174913 6.372337

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() 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 rowCounts 0.031985 0.0356685 0.0399702 0.0377125 0.0435030 0.070805
2 rowSums 0.064445 0.0692020 0.0764049 0.0726110 0.0820465 0.119230
3 apply+sum 0.258466 0.2754525 0.3094303 0.2902240 0.3294460 0.483973
  expr min lq mean median uq max
1 rowCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
2 rowSums 2.014851 1.940143 1.911548 1.925383 1.885996 1.683921
3 apply+sum 8.080850 7.722570 7.741530 7.695698 7.572949 6.835294

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on integer+100x100 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() 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 rowCounts 31.985 35.6685 39.97017 37.7125 43.5030 70.805
1 colCounts 42.724 47.5290 53.33639 50.9165 57.8555 109.744
  expr min lq mean median uq max
2 rowCounts 1.000000 1.00000 1.000000 1.000000 1.00000 1.000000
1 colCounts 1.335751 1.33252 1.334405 1.350123 1.32992 1.549947

Figure: Benchmarking of colCounts() and rowCounts() on integer+100x100 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

1000x10 matrix

> X <- data[["1000x10"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() 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 colSums 0.039845 0.041388 0.0454423 0.0444495 0.0479125 0.083981
1 colCounts 0.044569 0.046770 0.0520864 0.0513160 0.0557325 0.082555
3 apply+sum 0.130870 0.135431 0.1509504 0.1474645 0.1664075 0.224711
  expr min lq mean median uq max
2 colSums 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 colCounts 1.118559 1.130038 1.146211 1.154479 1.163214 0.983020
3 apply+sum 3.284477 3.272229 3.321806 3.317574 3.473154 2.675736

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() 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 rowCounts 0.033575 0.0375830 0.0418534 0.0412785 0.0456020 0.073876
3 apply+sum 0.120425 0.1293015 0.1431415 0.1362375 0.1510665 0.224308
2 rowSums 0.180225 0.1928710 0.2117158 0.2003005 0.2311610 0.274867
  expr min lq mean median uq max
1 rowCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
3 apply+sum 3.586746 3.440425 3.420066 3.300447 3.312717 3.036277
2 rowSums 5.367833 5.131868 5.058504 4.852417 5.069098 3.720654

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on integer+1000x10 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() 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 rowCounts 33.575 37.583 41.85343 41.2785 45.6020 73.876
1 colCounts 44.569 46.770 52.08644 51.3160 55.7325 82.555
  expr min lq mean median uq max
2 rowCounts 1.000000 1.000000 1.000000 1.000000 1.00000 1.000000
1 colCounts 1.327446 1.244446 1.244496 1.243165 1.22215 1.117481

Figure: Benchmarking of colCounts() and rowCounts() on integer+1000x10 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

10x1000 matrix

> X <- data[["10x1000"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() 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 colSums 0.030778 0.034657 0.0405747 0.0369215 0.0429595 0.084831
1 colCounts 0.038625 0.043015 0.0496964 0.0468140 0.0522395 0.095721
3 apply+sum 1.310625 1.412213 1.5375623 1.4823900 1.5930885 2.639316
  expr min lq mean median uq max
2 colSums 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 colCounts 1.254955 1.241163 1.224811 1.267933 1.216017 1.128373
3 apply+sum 42.583176 40.748276 37.894589 40.149777 37.083497 31.112636

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() 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 rowCounts 0.027429 0.0308805 0.0356957 0.0335800 0.0377655 0.088183
2 rowSums 0.045477 0.0498400 0.0552398 0.0522535 0.0581305 0.094048
3 apply+sum 1.300316 1.4117940 1.5084055 1.4651420 1.5634850 2.087419
  expr min lq mean median uq max
1 rowCounts 1.00000 1.000000 1.000000 1.00000 1.000000 1.000000
2 rowSums 1.65799 1.613964 1.547518 1.55609 1.539249 1.066509
3 apply+sum 47.40661 45.717977 42.257298 43.63139 41.399823 23.671445

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on integer+10x1000 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() on integer+10x1000 data (original and transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.

  expr min lq mean median uq max
2 rowCounts 27.429 30.8805 35.69574 33.580 37.7655 88.183
1 colCounts 38.625 43.0150 49.69637 46.814 52.2395 95.721
  expr min lq mean median uq max
2 rowCounts 1.000000 1.00000 1.000000 1.000000 1.00000 1.000000
1 colCounts 1.408181 1.39295 1.392221 1.394104 1.38326 1.085481

Figure: Benchmarking of colCounts() and rowCounts() on integer+10x1000 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

100x1000 matrix

> X <- data[["100x1000"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() 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
2 colSums 0.264572 0.2920820 0.4882184 0.3013125 0.312993 17.844516
1 colCounts 0.307298 0.3376245 0.3505225 0.3475470 0.355038 0.528144
3 apply+sum 2.056618 2.2697440 2.3934044 2.3261405 2.393671 3.689791
  expr min lq mean median uq max
2 colSums 1.000000 1.000000 1.0000000 1.000000 1.000000 1.0000000
1 colCounts 1.161491 1.155924 0.7179624 1.153444 1.134332 0.0295970
3 apply+sum 7.773377 7.770914 4.9023232 7.720027 7.647684 0.2067745

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() 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 rowCounts 0.227010 0.249994 0.2627078 0.2573680 0.2647860 0.414471
2 rowSums 0.406690 0.449248 0.4665504 0.4651525 0.4743145 0.603410
3 apply+sum 2.053905 2.266421 2.5475558 2.3270635 2.3745725 20.193188
  expr min lq mean median uq max
1 rowCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
2 rowSums 1.791507 1.797035 1.775929 1.807344 1.791313 1.455856
3 apply+sum 9.047641 9.065904 9.697297 9.041775 8.967893 48.720388

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on integer+100x1000 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() 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 rowCounts 227.010 249.9940 262.7078 257.368 264.786 414.471
1 colCounts 307.298 337.6245 350.5225 347.547 355.038 528.144
  expr min lq mean median uq max
2 rowCounts 1.000000 1.00000 1.000000 1.000000 1.000000 1.00000
1 colCounts 1.353676 1.35053 1.334267 1.350389 1.340849 1.27426

Figure: Benchmarking of colCounts() and rowCounts() on integer+100x1000 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

1000x100 matrix

> X <- data[["1000x100"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() 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 colSums 0.264082 0.2834590 0.3026913 0.2948455 0.3111115 0.445120
1 colCounts 0.294222 0.3198440 0.3525906 0.3305465 0.3760595 0.527161
3 apply+sum 0.865563 0.9335955 1.0999853 0.9697700 1.1156315 8.721477
  expr min lq mean median uq max
2 colSums 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 colCounts 1.114131 1.128361 1.164852 1.121084 1.208761 1.184312
3 apply+sum 3.277630 3.293582 3.634017 3.289079 3.585954 19.593541

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() 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 rowCounts 0.230868 0.2524785 0.2713328 0.2598240 0.289090 0.404084
2 rowSums 0.507178 0.5500880 0.5884659 0.5672945 0.600566 0.858183
3 apply+sum 0.868879 0.9416785 1.1061136 0.9848270 1.086796 8.908098
  expr min lq mean median uq max
1 rowCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
2 rowSums 2.196831 2.178752 2.168797 2.183380 2.077436 2.123774
3 apply+sum 3.763532 3.729737 4.076594 3.790362 3.759369 22.045164

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on integer+1000x100 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() 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 rowCounts 230.868 252.4785 271.3328 259.8240 289.0900 404.084
1 colCounts 294.222 319.8440 352.5906 330.5465 376.0595 527.161
  expr min lq mean median uq max
2 rowCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 colCounts 1.274417 1.266817 1.299476 1.272194 1.300839 1.304583

Figure: Benchmarking of colCounts() and rowCounts() 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 matrix

> X <- data[["10x10"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() 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
2 colSums 0.006344 0.0071695 0.0081452 0.0081490 0.0087110 0.019743
1 colCounts 0.007943 0.0087810 0.0101203 0.0095020 0.0108475 0.039544
3 apply+sum 0.041412 0.0426590 0.0445136 0.0436835 0.0447230 0.109605
  expr min lq mean median uq max
2 colSums 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
1 colCounts 1.252049 1.224772 1.242481 1.166033 1.245265 2.002938
3 apply+sum 6.527743 5.950066 5.464980 5.360596 5.134083 5.551588

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() 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
2 rowSums 0.007392 0.007844 0.0087515 0.008557 0.0092035 0.020365
1 rowCounts 0.006947 0.007600 0.0089012 0.009197 0.0096325 0.032405
3 apply+sum 0.041534 0.042505 0.0441844 0.043150 0.0438720 0.109962
  expr min lq mean median uq max
2 rowSums 1.0000000 1.0000000 1.000000 1.000000 1.000000 1.000000
1 rowCounts 0.9397998 0.9688934 1.017106 1.074793 1.046613 1.591210
3 apply+sum 5.6187771 5.4187914 5.048778 5.042655 4.766882 5.399558

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on double+10x10 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() 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 rowCounts 6.947 7.600 8.90121 9.197 9.6325 32.405
1 colCounts 7.943 8.781 10.12032 9.502 10.8475 39.544
  expr min lq mean median uq max
2 rowCounts 1.000000 1.000000 1.00000 1.000000 1.000000 1.000000
1 colCounts 1.143371 1.155395 1.13696 1.033163 1.126135 1.220306

Figure: Benchmarking of colCounts() and rowCounts() on double+10x10 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

100x100 matrix

> X <- data[["100x100"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() 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 colCounts 0.029451 0.0327940 0.0364990 0.0345375 0.0390410 0.084870
2 colSums 0.034015 0.0366715 0.0405585 0.0387515 0.0427565 0.062180
3 apply+sum 0.259060 0.2786255 0.3076613 0.2882320 0.3260625 0.462047
  expr min lq mean median uq max
1 colCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.0000000
2 colSums 1.154969 1.118238 1.111224 1.122012 1.095169 0.7326499
3 apply+sum 8.796306 8.496234 8.429312 8.345480 8.351797 5.4441734

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() 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 rowCounts 0.034162 0.0376705 0.0413610 0.0395395 0.0449590 0.074276
2 rowSums 0.061404 0.0658195 0.0718368 0.0688490 0.0761715 0.098664
3 apply+sum 0.258734 0.2785950 0.3077394 0.2928375 0.3306725 0.501462
  expr min lq mean median uq max
1 rowCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
2 rowSums 1.797436 1.747243 1.736824 1.741271 1.694244 1.328343
3 apply+sum 7.573737 7.395575 7.440327 7.406201 7.354979 6.751333

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on double+100x100 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() 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 colCounts 29.451 32.7940 36.49898 34.5375 39.041 84.870
2 rowCounts 34.162 37.6705 41.36100 39.5395 44.959 74.276
  expr min lq mean median uq max
1 colCounts 1.000000 1.000000 1.00000 1.000000 1.000000 1.0000000
2 rowCounts 1.159961 1.148701 1.13321 1.144828 1.151584 0.8751738

Figure: Benchmarking of colCounts() and rowCounts() on double+100x100 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

1000x10 matrix

> X <- data[["1000x10"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() 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 colCounts 0.032257 0.0350105 0.0383101 0.0381240 0.0405645 0.069719
2 colSums 0.036943 0.0411305 0.0443320 0.0426715 0.0471730 0.080673
3 apply+sum 0.134531 0.1494320 0.1595826 0.1582715 0.1703885 0.255708
  expr min lq mean median uq max
1 colCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
2 colSums 1.145271 1.174805 1.157189 1.119282 1.162913 1.157116
3 apply+sum 4.170599 4.268205 4.165552 4.151492 4.200434 3.667695

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() 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 rowCounts 0.035295 0.0384135 0.0423436 0.0417395 0.0461890 0.073065
3 apply+sum 0.126264 0.1350770 0.1465840 0.1405220 0.1551805 0.228310
2 rowSums 0.183670 0.1957190 0.2099086 0.1985195 0.2278255 0.277979
  expr min lq mean median uq max
1 rowCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
3 apply+sum 3.577391 3.516394 3.461779 3.366643 3.359685 3.124752
2 rowSums 5.203853 5.095058 4.957275 4.756154 4.932462 3.804544

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on double+1000x10 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() 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 colCounts 32.257 35.0105 38.31008 38.1240 40.5645 69.719
2 rowCounts 35.295 38.4135 42.34355 41.7395 46.1890 73.065
  expr min lq mean median uq max
1 colCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
2 rowCounts 1.094181 1.097199 1.105285 1.094835 1.138656 1.047993

Figure: Benchmarking of colCounts() and rowCounts() on double+1000x10 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

10x1000 matrix

> X <- data[["10x1000"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() 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 colCounts 0.026414 0.0304460 0.0347676 0.0328335 0.036252 0.079650
2 colSums 0.028785 0.0321795 0.0374942 0.0349530 0.039920 0.081596
3 apply+sum 1.331657 1.4318335 1.5451198 1.4898125 1.598719 2.168075
  expr min lq mean median uq max
1 colCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
2 colSums 1.089763 1.056937 1.078424 1.064553 1.101181 1.024432
3 apply+sum 50.414818 47.028624 44.441371 45.374770 44.100160 27.220025

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() 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 rowCounts 0.029032 0.0331615 0.0380870 0.035666 0.039444 0.091821
2 rowSums 0.043969 0.0476690 0.0522297 0.049749 0.054849 0.090145
3 apply+sum 1.329039 1.4252550 1.5246144 1.494509 1.580462 2.077634
  expr min lq mean median uq max
1 rowCounts 1.000000 1.00000 1.000000 1.000000 1.000000 1.0000000
2 rowSums 1.514501 1.43748 1.371327 1.394858 1.390554 0.9817471
3 apply+sum 45.778417 42.97921 40.029795 41.902919 40.068502 22.6270025

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on double+10x1000 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() 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 colCounts 26.414 30.4460 34.76760 32.8335 36.252 79.650
2 rowCounts 29.032 33.1615 38.08699 35.6660 39.444 91.821
  expr min lq mean median uq max
1 colCounts 1.000000 1.000000 1.000000 1.000000 1.00000 1.000000
2 rowCounts 1.099114 1.089191 1.095474 1.086269 1.08805 1.152806

Figure: Benchmarking of colCounts() and rowCounts() on double+10x1000 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

100x1000 matrix

> X <- data[["100x1000"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() 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 colCounts 0.204109 0.2176435 0.2348922 0.2308800 0.2431070 0.351074
2 colSums 0.236322 0.2598745 0.2830678 0.2720045 0.2954255 0.446940
3 apply+sum 2.061638 2.2621880 2.5896254 2.3428130 2.5183635 18.981519
  expr min lq mean median uq max
1 colCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
2 colSums 1.157822 1.194038 1.205097 1.178121 1.215208 1.273065
3 apply+sum 10.100672 10.394007 11.024739 10.147319 10.359074 54.067003

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() 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 rowCounts 0.244753 0.2655530 0.2798852 0.271549 0.2849060 0.444187
2 rowSums 0.379399 0.4117765 0.4325325 0.425415 0.4430005 0.586766
3 apply+sum 2.050156 2.2776410 2.5832776 2.336193 2.4756675 18.869115
  expr min lq mean median uq max
1 rowCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
2 rowSums 1.550130 1.550638 1.545392 1.566623 1.554901 1.320989
3 apply+sum 8.376428 8.576973 9.229775 8.603208 8.689419 42.480115

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on double+100x1000 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() on double+100x1000 data (original and transposed). The top panel shows times in milliseconds and the bottom panel shows relative times.

  expr min lq mean median uq max
1 colCounts 204.109 217.6435 234.8922 230.880 243.107 351.074
2 rowCounts 244.753 265.5530 279.8852 271.549 284.906 444.187
  expr min lq mean median uq max
1 colCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
2 rowCounts 1.199129 1.220128 1.191547 1.176148 1.171937 1.265223

Figure: Benchmarking of colCounts() and rowCounts() on double+100x1000 data (original and transposed). Outliers are displayed as crosses. Times are in milliseconds.

1000x100 matrix

> X <- data[["1000x100"]]
> value <- 42
> colStats <- microbenchmark(colCounts = colCounts(X, value = value, na.rm = FALSE), colSums = colSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 2L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")
> X <- t(X)
> rowStats <- microbenchmark(rowCounts = rowCounts(X, value = value, na.rm = FALSE), rowSums = rowSums(X == 
+     value, na.rm = FALSE), `apply+sum` = apply(X, MARGIN = 1L, FUN = function(x) sum(x == value, 
+     na.rm = FALSE)), unit = "ms")

Table: Benchmarking of colCounts(), colSums() and apply+sum() 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 colCounts 0.188446 0.2039120 0.2266170 0.2138475 0.2439680 0.363926
2 colSums 0.239284 0.2524595 0.2764089 0.2650605 0.2946225 0.394276
3 apply+sum 0.869810 0.9181520 1.0874815 0.9709860 1.0909525 7.299217
  expr min lq mean median uq max
1 colCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
2 colSums 1.269775 1.238081 1.219718 1.239484 1.207628 1.083396
3 apply+sum 4.615699 4.502687 4.798764 4.540553 4.471703 20.056871

Table: Benchmarking of rowCounts(), rowSums() and apply+sum() 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 rowCounts 0.245975 0.2657100 0.2879802 0.2738550 0.294662 0.552648
2 rowSums 0.478853 0.5219055 0.6137815 0.5359280 0.568132 6.887381
3 apply+sum 0.895298 0.9454045 1.0431311 0.9930245 1.098558 2.157093
  expr min lq mean median uq max
1 rowCounts 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
2 rowSums 1.946755 1.964192 2.131332 1.956977 1.928080 12.462510
3 apply+sum 3.639793 3.558031 3.622232 3.626096 3.728199 3.903195

Figure: Benchmarking of colCounts(), colSums() and apply+sum() on double+1000x100 data as well as rowCounts(), rowSums() and apply+sum() on the same data transposed. Outliers are displayed as crosses. Times are in milliseconds.

Table: Benchmarking of colCounts() and rowCounts() 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 colCounts 188.446 203.912 226.6170 213.8475 243.968 363.926
2 rowCounts 245.975 265.710 287.9802 273.8550 294.662 552.648
  expr min lq mean median uq max
1 colCounts 1.000000 1.000000 1.000000 1.000000 1.00000 1.000000
2 rowCounts 1.305281 1.303062 1.270779 1.280609 1.20779 1.518573

Figure: Benchmarking of colCounts() and rowCounts() 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 38.2 secs.

Reproducibility

To reproduce this report, do:

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

Copyright Henrik Bengtsson. Last updated on 2021-08-25 18:52:18 (+0200 UTC). Powered by RSP.