This is more a comment than a question, as they say. I discovered some years ago that different syntaxes for extracting a column from a matrix have different run times. In the test below, for matrices with less than about 10,000 rows, it's faster to precompute a colvector one2N=1::N, and then do M[one2N, 3] instead of M[.,3] or M[,3] or M[|.,3\3,.|]. I found this surprising. But if one wants to extract several columns, then it seems best to do something like M[., (3,5)].
I found this to be true on a Lenovo T430 laptop with an i7 processor in Stata/IC, and on an old HP workstation with 12 cores and 12-core Stata MP.
Here's some test code.
I found this to be true on a Lenovo T430 laptop with an i7 processor in Stata/IC, and on an old HP workstation with 12 cores and 12-core Stata MP.
Here's some test code.
Code:
cap mata mata drop test()
mata
mata set matastrict on
mata set mataoptimize on
mata set matalnum off
// N = rows of matrix to extract from; iter = number of repetitions; p = rowvector of cols to extract
void test(real scalar N, real scalar iter, real rowvector p) {
real colvector one2N
real matrix M, S, t
real scalar i
M = runiform(N, 5)
one2N = 1::N
timer_clear()
timer_on(1)
for (i=iter;i;i--) t = M[,p]
timer_off(1)
timer_on(2)
for (i=iter;i;i--) t = M[.,p]
timer_off(2)
timer_on(3)
for (i=iter;i;i--) t = M[one2N,p]
timer_off(3)
if (cols(p)==1) {
S = .,p\.,p
timer_on(4)
for (i=iter;i;i--) t = M[|S|]
timer_off(4)
}
timer()
}
test(10,1000000 ,3)
test(100,1000000,3)
test(1000,100000,3)
test(10000,10000,3)
test(1000000,100,3)
mata
test(10,1000000 ,(3,5))
test(100,1000000,(3,5))
test(1000,100000,(3,5))
test(10000,10000,(3,5))
test(1000000,100,(3,5))
end

Comment