[Bioc-devel] S4 Method Slow Execution if Signature Has Multiple Class Unions

Dario Strbenac d@tr7320 @end|ng |rom un|@@ydney@edu@@u
Wed Nov 24 12:00:04 CET 2021


Hello,

Thanks. It was difficult to pinpoint, but I was able to make a minimal example. It happens only if SummarizedExperiment is pre-loaded. The difference is 0.2 seconds versus 32 seconds on my modest Windows 10 laptop computer - a 150 times slowdown. Can you reproduce it?

library(SummarizedExperiment)

setClassUnion("characterOrMissing", c("character", "missing"))
setClassUnion("integerOrMissing", c("integer", "missing"))
setClass("ParamsSet", representation(A = "characterOrMissing", B = "integer"))
setGeneric("ParamsSet", function(A, B, C, D, E, F, G, H) standardGeneric("ParamsSet"))

setMethod("ParamsSet", c("missing", "missing", "missing", "missing", "missing", "missing", "missing", "missing"),
function() # Empty constructor
{
  new("ParamsSet", A = 'M', B = 300L)
})

setMethod("ParamsSet", c("characterOrMissing", "integerOrMissing", "integerOrMissing", "integerOrMissing",
                         "characterOrMissing", "integerOrMissing", "integerOrMissing", "integerOrMissing"),
function(A = c('L', 'M', 'N'), B = 500, C = 100, D, E, F, G, H)
{
  if(missing(A)) A <- 'L' # Mimick match.arg.
  if(missing(B)) B <- 500L # Hack to implement parameter defaults not specified by generic.
  if(missing(C)) C <- 100L
  new("ParamsSet", A = A, B = B)
})

system.time(ParamsSet(B = 999L)) # Slow or fast, depending on SummarizedExperiment presence.

--------------------------------------
Dario Strbenac
University of Sydney
Camperdown NSW 2050
Australia


More information about the Bioc-devel mailing list