Rprof( ) 函数提供了有用的信息帮助我们找到代码瓶颈,进而提升代码性能。

RStudio 也发布了一个增强版的分析工具 profvis( ),它还提供了用于分析 R 代码的交

互式可视化功能(https://rstudio.github.io/profvis/)。

它是一个 R 扩展包,已经集成到 RStudio 中。要安装这个包,请运行以下代码:

install.packages("profvis")

一旦安装成功,我们就可以用 profvis( ) 来分析代码,并将结果进行可视化:

library(profvis)
profvis({
my_cumsum1 <- function(x) {
y <- numeric( )
sum_x <- 0
for (xi in x) {
sum_x <- sum_x + xi
y <- c(y, sum_x)
}
y
}
x <- rnorm(1000)
for (i in 1:1000) {
my_ _cumsum1(x)
}
})

分析完成后,会出现一个带有交互式用户界面的新选项卡,如图 13-4 所示。

用 profvis 进行性能分析_github


图 13-4

图 13-4 的上部显示了代码、内存使用情况和消耗时间,下部显示了函数调用,以及垃

圾收集发生的时间轴。我们可以单击并选择一行代码,查看函数执行的时间轴。

与 summaryRprof( ) 返回的结果相比,这种交互式可视化提供了更丰富的信息,使我们

能够更多地了解在这么长的时间里代码是如何运行的。这样,我们可以很容易地识别慢的

代码,以及可能引发问题的某些模式。

接下来,对 my_cumsum2( ) 做同样的分析:

profvis({
my_cumsum2 <- function(x) {
y <- numeric(length(x))
y[[1]] <- x[[1]]
for (i in 2:length(x)) {
y[[i]] <- y[[i-1]] + x[[i]]
}
y
}
x <- rnorm(1000)
for (i in 1:1000) {
my_ _cumsum2(x)
}
})

这次的分析结果如图 13-5 所示。

用 profvis 进行性能分析_函数调用_02


图 13-5

我们可以很容易地找到运行时间最长的部分,并衡量其是否可接受。在所有的代码中,

总会有一些代码占用了大部分时间,但这并不意味着它太慢。如果代码能够达到目标,性

能也是可接受的,那么就没有必要冒着将其修改成错误的风险去优化它的性能了。