我一直在使用R引用类编写代码。然而,随着我的进步,该计划变得慢得令人无法忍受。若要演示该问题,请采用以下示例:
myClass <- setRefClass(
"Class"="myClass",
fields=c(
counter="numeric"
),
methods=list(
initialize=function () {
counter <<- 0
},
donothing=function () {
},
rand=function () {
return(runif(1))
},
increment=function () {
counter <<- counter + 1
}
)
)
mc <- myClass()
system.time(for (it in 1:500000) {
mc$donothing()
})
system.time(for (it in 1:500000) {
mc$rand()
})
system.time(for (it in 1:500000) {
mc$increment()
})
它需要:
- 4s 用于调用方法
- 7s 用于调用以生成随机数
- 19s 递增字段值
这是给我带来问题的最后一个结果。我显然不希望增加一个数字所需的时间是生成一个随机数的两倍。我的代码涉及引用类中字段值的大量访问和更改,这种性能问题使程序几乎可用。
我的问题:我可以做些什么来提高 R 参考类中字段查找/访问的性能?我应该做些什么不同的事情吗?
似乎一个主要的性能问题是由于在fields
参数中提供了类名。如果我更换
fields=c(
counter="numeric"
),
跟
fields=c("counter")
计算在 5 秒内完成,而 19 秒。从文档中很难确定为什么性能损失如此之大 - 也许是由于在作业期间检查类。该文档提到了以下内容:
特别是,具有指定类的字段作为活动绑定的特殊形式实现,以强制对字段进行有效赋值
我不太确定"活动绑定"是什么,但我认为它引入了一些预赋值逻辑。