[Rd] crossprod is slower than t(AA)%*BB
Prof Brian Ripley
ripley at stats.ox.ac.uk
Tue Mar 11 14:41:05 CET 2008
Please, you can't compare calls starting with different memory settings
(and the garbage collector does adjust to recent usage). Try
them in the other order or in parallel sessions.
>From the times you quote it looks to me as if you would benefit from using
an optimized BLAS. Here are some results on a dual core 64-bit Linux
system with the Goto BLAS and one thread, starting from the same point (a
fresh session loading a saved workspace containing AA and BB)
> system.time(t(AA)%*%BB,gcFirst=TRUE)
user system elapsed
4.304 0.046 4.351
> system.time(t(AA)%*%BB,gcFirst=TRUE)
user system elapsed
5.026 0.053 5.082
> system.time(t(AA)%*%BB,gcFirst=TRUE)
user system elapsed
4.992 0.033 5.028
> system.time(t(AA)%*%BB,gcFirst=TRUE)
user system elapsed
4.979 0.043 5.026
> system.time(t(AA)%*%BB,gcFirst=TRUE)
user system elapsed
5.012 0.030 5.046
and in another session
> system.time(crossprod(AA,BB),gcFirst=TRUE)
user system elapsed
4.616 0.026 4.644
> system.time(crossprod(AA,BB),gcFirst=TRUE)
user system elapsed
4.791 0.000 4.817
> system.time(crossprod(AA,BB),gcFirst=TRUE)
user system elapsed
4.764 0.000 4.779
> system.time(crossprod(AA,BB),gcFirst=TRUE)
user system elapsed
4.092 0.000 4.095
> system.time(crossprod(AA,BB),gcFirst=TRUE)
user system elapsed
4.824 0.000 4.834
Note how there is a lot of variability depending on the initial memory
state. I would be surprised if the differences you are seeing exceed the
reproducibilty spreads.
BTW: gcFirst=TRUE is the default, and I get a considerable speed up (but
even more variability) by allowing multiple threads.
On Mon, 10 Mar 2008, Ole Fredslund Christensen wrote:
> Dear Rdevelopers
>
> The background for this email is that I was helping a PhD student to
> improve the speed of her R code. I suggested to replace calls like
> t(AA)%*% BB by crossprod(AA,BB) since I expected this to be faster. The
> surprising result to me was that this change actually made her code
> slower.
>
>
>> ## Examples :
>>
>> AA <- matrix(rnorm(3000*1000),3000,1000)
>> BB <- matrix(rnorm(3000^2),3000,3000)
>> system.time(crossprod(AA,BB),gcFirst=TRUE)
> user system elapsed
> 24.58 0.06 24.69
>> system.time(t(AA)%*%BB,gcFirst=TRUE)
> user system elapsed
> 23.25 0.04 23.32
>>
>>
>> AA <- matrix(rnorm(2000^2),2000,2000)
>> BB <- matrix(rnorm(2000^2),2000,2000)
>> system.time(crossprod(AA,BB),gcFirst=TRUE)
> user system elapsed
> 21.94 0.03 21.98
>> system.time(t(AA)%*%BB,gcFirst=TRUE)
> user system elapsed
> 21.16 0.02 21.19
>>
>>
>> version
> _
> platform i386-pc-mingw32
> arch i386
> os mingw32
> system i386, mingw32
> status
> major 2
> minor 6.2
> year 2008
> month 02
> day 08
> svn rev 44383
> language R
> version.string R version 2.6.2 (2008-02-08)
>
>
> Clearly there are many examples where crossprod is indeed faster than
> t(x)%*%y,
> but I suggest to change the wording in the help file for crossprod such
> that it says
> ".... formally equivalent (but often faster than) the call t(x)%*%y ...
> ".
>
>
> Yours
>
> Ole Christensen
>
>
>
>
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
--
Brian D. Ripley, ripley at stats.ox.ac.uk
Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel: +44 1865 272861 (self)
1 South Parks Road, +44 1865 272866 (PA)
Oxford OX1 3TG, UK Fax: +44 1865 272595
More information about the R-devel
mailing list