Mikael Jagan
2022-Aug-27 23:13 UTC
[Rd] R_check_class_etc(x, valid) is "slow" when 'valid' contains class(x)
R_check_class_etc(x, valid) spends a nontrivial amount of time finding an environment 'rho' containing the definition of class(x), evaluating (in R, not C) methods::.classEnv(class(x)). It then returns the result of R_check_class_and_super(x, valid, rho). But R_check_class_and_super() does not use 'rho' at all in the trivial case where class(x) is found in 'valid'. My feeling is that this can be improved. I am happy to contribute a patch, if it would be considered by R-core. Mikael
Tomas Kalibera
2022-Sep-02 09:30 UTC
[Rd] R_check_class_etc(x, valid) is "slow" when 'valid' contains class(x)
Hi Mikael, On 8/28/22 01:13, Mikael Jagan wrote:> R_check_class_etc(x, valid) spends a nontrivial amount of time finding > an environment 'rho' containing the definition of class(x), evaluating > (in R, not C) methods::.classEnv(class(x)). > > It then returns the result of R_check_class_and_super(x, valid, rho). > But R_check_class_and_super() does not use 'rho' at all in the trivial > case where class(x) is found in 'valid'.right, that could be improved. Do you have an example which exhibits the problem, have you found this by profiling something?> > My feeling is that this can be improved.? I am happy to contribute a > patch, > if it would be considered by R-core.Both R_check_class_etc and R_check_class_and_super are unfortunately exported, the former is used a lot in packages (even though they are not mentioned in Writing R Extensions, so actually shouldn't be used in packages). Anyway, it would be easier if we could preserve their interface and behavior. Maybe we could support rho==NULL in R_check_class_and_super, the environment would be looked up in that case when needed. R_check_class_etc would simply only call R_check_class_and_super with that argument. I see that R_check_class_and_super uses asChar() on the class attribute, while R_check_class_etc does not currently for looking for the environment, but I assume doing that in both cases should not matter (and it would have to be tested). So this would be a trivial change, but if you wanted to create a minimal patch, I will be happy to have a look. Best Tomas> Mikael > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel