Matthew Dowle
2012-Sep-03 02:04 UTC
[Rd] Possible page inefficiency in do_matrix in array.c
In do_matrix in src/array.c there is a type switch containing :
case LGLSXP :
for (i = 0; i < nr; i++)
for (j = 0; j < nc; j++)
LOGICAL(ans)[i + j * NR] = NA_LOGICAL;
That seems page inefficient, iiuc. Think it should be :
case LGLSXP :
for (j = 0; j < nc; j++)
for (i = 0; i < nr; i++)
LOGICAL(ans)[i + j * NR] = NA_LOGICAL;
or more simply :
case LGLSXP :
for (i = 0; i < nc*nr; i++)
LOGICAL(ans)[i] = NA_LOGICAL;
( with some fine tuning required since NR is type R_xlen_t whilst i, nc
and nr are type int ).
Same goes for all the other types in that switch.
This came up on Stack Overflow here :
http://stackoverflow.com/questions/12220128/reason-for-faster-matrix-allocation-in-r
Matthew
Simon Urbanek
2012-Sep-03 02:32 UTC
[Rd] Possible page inefficiency in do_matrix in array.c
On Sep 2, 2012, at 10:04 PM, Matthew Dowle wrote:> > In do_matrix in src/array.c there is a type switch containing : > > case LGLSXP : > for (i = 0; i < nr; i++) > for (j = 0; j < nc; j++) > LOGICAL(ans)[i + j * NR] = NA_LOGICAL; > > That seems page inefficient, iiuc. Think it should be : > > case LGLSXP : > for (j = 0; j < nc; j++) > for (i = 0; i < nr; i++) > LOGICAL(ans)[i + j * NR] = NA_LOGICAL; > > or more simply : > > case LGLSXP : > for (i = 0; i < nc*nr; i++) > LOGICAL(ans)[i] = NA_LOGICAL; > > ( with some fine tuning required since NR is type R_xlen_t whilst i, nc > and nr are type int ). > > Same goes for all the other types in that switch. > > This came up on Stack Overflow here : > http://stackoverflow.com/questions/12220128/reason-for-faster-matrix-allocation-in-r >That is completely irrelevant - modern compilers will optimize the loops accordingly and there is no difference in speed. If you don't believe it, run benchmarks ;) original> microbenchmark(matrix(nrow=10000, ncol=9999), times=10)Unit: milliseconds expr min lq median uq max 1 matrix(nrow = 10000, ncol = 9999) 940.5519 940.6644 941.136 954.7196 1409.901 swapped> microbenchmark(matrix(nrow=10000, ncol=9999), times=10)Unit: milliseconds expr min lq median uq max 1 matrix(nrow = 10000, ncol = 9999) 949.9638 950.6642 952.7497 961.001 1246.573 Cheers, Simon> Matthew > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > >
Seemingly Similar Threads
- unlist errors on a nested list of empty lists
- [SPAM Warning!] Suggestion to emphasize Rboolean is unrelated to LGLSXP in R-exts
- unlist errors on a nested list of empty lists
- table() and as.character() performance for logical values
- unlist errors on a nested list of empty lists