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
The functions
second,minuteandhourcurrently have a faster method, by bypassingas.POSIXlt(), for POSIXct objectss underUTC. See here.The faster logic needs to be also included for
ITimeobjects. The fix is quite simple. The if statement in all these functions need an additional|| inherits(x, "ITime")Here's a quick benchmark: