From osklyar at maninvestments.com  Tue Sep  9 15:29:13 2008
From: osklyar at maninvestments.com (Sklyar, Oleg (London))
Date: Tue, 9 Sep 2008 14:29:13 +0100
Subject: [Rd] 'xtfrm' performance (influences 'order' performance) in R devel
Message-ID: <1A68FCB28DE72F4BA3B967E6506CCE4303049734@mildnpexmb01.maninvestments.ad.man.com>

Hello everybody,

it looks like the presense of some (do know know which) S4 methods for a
given S4 class degrades the performance of xtfrm (used in 'order' in new
R-devel) by a factor of millions. This is for classes that ARE derived
from numeric directly and thus should be quite trivial to convert to
numeric.

Consider the following example:

setClass("TimeDateBase", 
    representation("numeric", mode="character"),
    prototype(mode="posix")
)
setClass("TimeDate",
    representation("TimeDateBase", tzone="character"),
    prototype(tzone="London")
)
x = new("TimeDate", 1220966224 + runif(1e5))

system.time({ z = order(x) })
## > system.time({ z = order(x) })
##   user  system elapsed 
##  0.048   0.000   0.048 

getClass("TimeDate")
## Class "TimeDate"

## Slots:
                                    
## Name:      .Data     tzone      mode
## Class:   numeric character character

## Extends: 
## Class "TimeDateBase", directly
## Class "numeric", by class "TimeDateBase", distance 2
## Class "vector", by class "TimeDateBase", distance 3


Now, if I load a library that not only defines these same classes, but
also a bunch of methods for those, then I have the following result:

library(AHLCalendar)
x = now() + runif(1e5) ## just random times in POSIXct format
x[1:5]
## TimeDate [posix] object in 'Europe/London' of length 5:
## [1] "2008-09-09 14:19:35.218" "2008-09-09 14:19:35.672"
## [3] "2008-09-09 14:19:35.515" "2008-09-09 14:19:35.721"
## [5] "2008-09-09 14:19:35.657"

> system.time({ z = order(x) })


Enter a frame number, or 0 to exit   

 1: system.time({
 2: order(x)
 3: lapply(z, function(x) if (is.object(x)) xtfrm(x) else x)
 4: FUN(X[[1]], ...)
 5: xtfrm(x)
 6: xtfrm.default(x)
 7: as.vector(rank(x, ties.method = "min", na.last = "keep"))
 8: rank(x, ties.method = "min", na.last = "keep")
 9: switch(ties.method, average = , min = , max =
.Internal(rank(x[!nas], ties.
10: .gt(c(1220966375.21811, 1220966375.67217, 1220966375.51470,
1220966375.7211
11: x[j]
12: x[j]

Selection: 0
Timing stopped at: 47.618 13.791 66.478 

At the same time:

system.time({ z = as.numeric(x) }) ## same as x at .Data
##   user  system elapsed 
##  0.001   0.000   0.001 

The only difference between the two is that I have the following methods
defined for TimeDate (full listing below). 

Any idea why this could be happenning. And yes, it is down to xtfrm
function, 'order' was just a place where the problem occured. Should
xtfrm function be smarter with respect to classes that are actually
derived from 'numeric'?

> showMethods(class="TimeDate")
Function: + (package base)
e1="TimeDate", e2="TimeDate"
e1="TimeDate", e2="numeric"
    (inherited from: e1="TimeDateBase", e2="numeric")

Function: - (package base)
e1="TimeDate", e2="TimeDate"

Function: Time (package AHLCalendar)
x="TimeDate"

Function: TimeDate (package AHLCalendar)
x="TimeDate"

Function: TimeDate<- (package AHLCalendar)
x="TimeSeries", value="TimeDate"

Function: TimeSeries (package AHLCalendar)
x="data.frame", ts="TimeDate"
x="matrix", ts="TimeDate"
x="numeric", ts="TimeDate"

Function: [ (package base)
x="TimeDate", i="POSIXt", j="missing"
x="TimeDate", i="Time", j="missing"
x="TimeDate", i="TimeDate", j="missing"
x="TimeDate", i="integer", j="missing"
    (inherited from: x="TimeDateBase", i="ANY", j="missing")
x="TimeDate", i="logical", j="missing"
    (inherited from: x="TimeDateBase", i="ANY", j="missing")
x="TimeSeries", i="TimeDate", j="missing"
x="TimeSeries", i="TimeDate", j="vector"

Function: [<- (package base)
x="TimeDate", i="ANY", j="ANY", value="ANY"
x="TimeDate", i="ANY", j="ANY", value="numeric"
x="TimeDate", i="missing", j="ANY", value="ANY"
x="TimeDate", i="missing", j="ANY", value="numeric"

Function: add (package AHLCalendar)
x="TimeDate"

Function: addMonths (package AHLCalendar)
x="TimeDate"

Function: addYears (package AHLCalendar)
x="TimeDate"

Function: align (package AHLCalendar)
x="TimeDate", to="character"
x="TimeDate", to="missing"

Function: as.POSIXct (package base)
x="TimeDate"

Function: as.POSIXlt (package base)
x="TimeDate"

Function: coerce (package methods)
from="TimeDate", to="TimeDateBase"

Function: coerce<- (package methods)
from="TimeDate", to="numeric"

Function: dates (package AHLCalendar)
x="TimeDate"

Function: format (package base)
x="TimeDate"

Function: fxFwdDate (package AHLCalendar)
x="TimeDate", country="character"

Function: fxSettleDate (package AHLCalendar)
x="TimeDate", country="character"

Function: holidays (package AHLCalendar)
x="TimeDate"

Function: index (package AHLCalendar)
x="TimeDate", y="POSIXt"
x="TimeDate", y="Time"
x="TimeDate", y="TimeDate"

Function: initialize (package methods)
.Object="TimeDate"
    (inherited from: .Object="ANY")

Function: leapYear (package AHLCalendar)
x="TimeDate"

Function: mday (package AHLCalendar)
x="TimeDate"

Function: mode (package base)
x="TimeDate"
    (inherited from: x="TimeDateBase")

Function: mode<- (package base)
x="TimeDate", value="character"
    (inherited from: x="TimeDateBase", value="character")

Function: month (package AHLCalendar)
x="TimeDate"

Function: pretty (package base)
x="TimeDate"

Function: prettyFormat (package AHLCalendar)
x="TimeDate", munit="character"
x="TimeDate", munit="missing"

Function: print (package base)
x="TimeDate"

Function: show (package methods)
object="TimeDate"
    (inherited from: object="TimeDateBase")

Function: summary (package base)
object="TimeDate"

Function: td2tz (package AHLCalendar)
x="TimeDate"

Function: times (package AHLCalendar)
x="TimeDate"

Function: tojulian (package AHLCalendar)
x="TimeDate"

Function: toposix (package AHLCalendar)
x="TimeDate"

Function: tots (package AHLCalendar)
x="TimeDate"

Function: tzone (package AHLCalendar)
x="TimeDate"

Function: tzone<- (package AHLCalendar)
x="TimeDate"

Function: wday (package AHLCalendar)
x="TimeDate"

Function: yday (package AHLCalendar)
x="TimeDate"

Function: year (package AHLCalendar)
x="TimeDate"



Dr Oleg Sklyar
Research Technologist
AHL / Man Investments Ltd
+44 (0)20 7144 3107
osklyar at maninvestments.com


**********************************************************************
The contents of this email are for the named addressee(s...{{dropped:22}}



[Rd] 'xtfrm' performance (influences 'order' performance) in R devel
Sklyar, Oleg (London