Ha, defined xtfrm for TimeDate, works instantly (xtfrm is already a
method). However, it won't be taken up by order as it is not in the
imported namespace, so order falls back to xtfrm.default.

Moreover, defining order (which is not a method unfortunately, *any
chance of changing this*?):

setGeneric("order")
setMethod("order", "TimeDate", 
        function (..., na.last = TRUE, decreasing = FALSE) 
                order(list(...)[EMAIL PROTECTED],na.last=na.last,
decreasing=decreasing))

does not help either as it won't be taken up, order still calls the
default one, what am I doing wrong?



Dr Oleg Sklyar
Research Technologist
AHL / Man Investments Ltd
+44 (0)20 7144 3107
[EMAIL PROTECTED] 

> -----Original Message-----
> From: John Chambers [mailto:[EMAIL PROTECTED] 
> Sent: 09 September 2008 15:11
> To: Sklyar, Oleg (London)
> Cc: R-devel@r-project.org
> Subject: Re: [Rd] 'xtfrm' performance (influences 'order' 
> performance) in R devel
> 
> No definitive answers, but here are a few observations.
> 
> In the call to order() code, I notice that you have dropped 
> into the branch
>     if (any(unlist(lapply(z, is.object))))
> where the alternative in your case would seem to have been 
> going directly to the internal code.
> 
> You can consider a method for xtfrm(), which would help but 
> won't get you completely back to a trivial computation.  
> Alternatively,  order() should be eligible for the new 
> mechanism of defining methods for "...".
> 
> (Individual existing methods may not be the issue, and one 
> can't infer anything definite from the evidence given,  but a 
> plausible culprit is the "[" method.  Because [] expressions 
> appear so often, it's always chancy to define a nontrivial 
> method for this function.)
> 
> John
> 
> Sklyar, Oleg (London) wrote: 
> 
>       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 [EMAIL PROTECTED]
>       ##   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
>       [EMAIL PROTECTED]
>       
>       
>       
> **********************************************************************
>       The contents of this email are for the named 
> addressee(s...{{dropped:22}}
>       
>       ______________________________________________
>       R-devel@r-project.org mailing list
>       https://stat.ethz.ch/mailman/listinfo/r-devel
>       
>         
> 
> 


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

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

Reply via email to