Skip to content

Faster second, minute and hour for objects of class ITime #3158

@arunsrinivasan

Description

@arunsrinivasan

The functions second, minute and hour currently have a faster method, by bypassing as.POSIXlt(), for POSIXct objectss under UTC. See here.

The faster logic needs to be also included for ITime objects. The fix is quite simple. The if statement in all these functions need an additional || inherits(x, "ITime")

Here's a quick benchmark:

# Current version
second  <- function(x) {
  if (inherits(x,'POSIXct') && identical(attr(x,'tzone'),'UTC')) {
    # if we know the object is in UTC, can calculate the hour much faster
    as.integer(x) %% 60L
  } else {
    as.integer(as.POSIXlt(x)$sec)
  }
}

# new version
fSecond<- function(x) {
  if (inherits(x, "ITime") || (inherits(x,'POSIXct') && identical(attr(x,'tzone'),'UTC'))) {
    # if we know the object is in UTC, can calculate the hour much faster
    as.integer(x) %% 60L
  } else {
    as.integer(as.POSIXlt(x)$sec)
  }
}

require(data.table)
x <- setattr(0:86399, "class", "ITime")
y <- sample(x, 50e7, TRUE)

system.time(a1 <- second(y))
#    user  system elapsed 
#   29.00   10.72   39.78 
system.time(a2 <- fSecond(y))
#    user  system elapsed 
#    3.51    0.56    4.06 
 
identical(a1, a2)
# [1] TRUE

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions