Patrick Burns wrote:
The following is at least as much out of intellectual curiosity
as for practical reasons.
On reviewing some code written by novices to R, I came
across:

crossprod(x, y)[1,1]

I  thought, "That isn't a very S way of saying that,  I wonder
what the penalty is for using 'crossprod'."  To my surprise the
penalty was substantially negative.  Handily the client had S-PLUS
as well -- there the sign of the penalty was as I had expected, but
the order of magnitude was off.

Here are the timings of 1 million computations on vectors of
length 1000.  This is under Windows, R version 1.9.1 and S-PLUS
6.2 (on the same machine).

Command                               R                        S-PLUS
sum(x * y)                              28.61                        97.6
crossprod(x, y)[1,1]                 6.77                     2256.2


Another example is when computing the sums of the columns of a matrix. For example:

set.seed(1)
jjm <- matrix(rnorm(600), 5)

Timings for this under Windows 2000 with R version 2.0.1 (on an
old chip running at about 0.7Ghz) for 100,000 computations are:

apply(jjm, 2, sum)               536.59
colSums(jjm)                         18.26
rep(1,5) %*% jjm                 15.41
crossprod(rep(1,5), jjm)        13.16

(These timings seem to be stable across R versions and on at least
one Linux platform.)

Andy Liaw showed another example of 'crossprod' being fast a couple
days ago on R-help.

Questions for those with a more global picture of the code:

*  Is the speed advantage of 'crossprod' inherent, or is it because
more care has been taken with its implementation than the other
functions?

*  Is 'crossprod' faster than 'sum(x * y)' because 'crossprod' is
going to BLAS while 'sum' can't?

For a numeric matrix crossprod ends up calling level 3 BLAS; either dsyrk for the single argument case or dgemm for the two argument case. Especially in accelerated versions of the BLAS like Atlas or Goto's BLAS, those routines are hideously efficient and that's where you are seeing the big gain in speed.


By the way, you didn't mention if you had an accelerated BLAS installed with R. Do you?

______________________________________________
R-devel@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to