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