KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
My S4 class has a method that is called many times. I noticed that the execution time is much slower than it would be if a similar function was called independently. So I added a slot with type "function" to my class and used that function instead of the method. The example below shows two ways of doing this, and both of them run much faster than the corresponding method. Also, the example suggests that the lower speed of the method is not due to method having to retrieve data from the class, since the functions are faster even when they also do that. Of course, this way of doing things is not ideal. I wonder if there is a way to accelerate method dispatch. Any suggestions? setClass(Class = "SpeedTest", representation = representation( x = "numeric", foo1 = "function", foo2 = "function" ) ) speedTest <- function(n) { new("SpeedTest", x = rnorm(n), foo1 = function(z) sqrt(abs(z)), foo2 = function() {} ) } setGeneric( name = "method.foo", def = function(object) {standardGeneric("method.foo")} ) setMethod( f = "method.foo", signature = "SpeedTest", definition = function(object) { sqrt(abs(object@x)) } ) setGeneric( name = "create.foo2", def = function(object) {standardGeneric("create.foo2")} ) setMethod( f = "create.foo2", signature = "SpeedTest", definition = function(object) { z <- object@x object@foo2 <- function() sqrt(abs(z)) object } ) > st <- speedTest(1000) > st <- create.foo2(st) > > iters <- 100000 > > system.time(for (i in seq(iters)) method.foo(st)) # slowest by far user system elapsed 3.26 0.00 3.27 > # much faster > system.time({foo1 <- st@foo1; x <- st@x; for (i in seq(iters)) foo1(x)})
Tags (comma-separated)
Save Edits
Cancel