我有一个庞大、复杂的 Shiny 应用程序,我想找出我在这个代码迷宫中最拖慢 Shiny 应用程序的地方。我尝试了 Rprof 和 profr,但没有得到太多的见解。
我认为这个问题需要一些更新,因此我会添加另一个答案...
您可以使用profvis
软件包来对shiny应用程序进行性能分析。它将为您的R代码直接提供火焰图。也就是说,不需要使用Chrome的火焰图并猜测瓶颈在哪里。您将确切地知道需要在哪里更改代码。
以下是具体操作:
某些步骤的详细信息如下:
步骤1:运行profvis
library(profvis)
profvis({ runApp('directory_of_shiny_app') }
, prof_output = '/directory_to_save_profile')
步骤 5:加载您的个人资料
profvis(prof_input = '/path_to_save_output/random_name.Rprof')
注意:Profvis会给您的文件随机命名。因此,您需要相应地更改输入路径。
第6步:转换为html格式
如果您有一个非常大的应用程序并且火焰图稍微长一点,可能需要执行此步骤。否则,您可能会收到错误消息:“Pandoc:...内存不足”。
p <- profvis(prof_input = '/path_to_save_output/file108f93bff877b.Rprof')
htmlwidgets::saveWidget(p, "/path_to_save_output/profile.html")
然后在浏览器中打开HTML文件。
browsermob
或HAR
文件。这是为了更容易地构建测试还是评估测试结果?看起来是后者。如果是这样,您会推荐使用它,而不是使用testthat
,或者也许两者一起使用? - Vincent从我的经验来看:
mydebug <- function(msg="[DEBUG]") {
DEBUG <- FALSE
if (DEBUG) {
print(sprintf("%s - %s - %s", msg1, as.character(Sys.time()), as.character(deparse(sys.calls()[[sys.nframe()-1]]))))
}
}
f <- function() {
mydebug()
## 这里是原始函数定义 .....
mydebug()
return(...) ## 返回值需要放在mydebug()之后
}
您可以获得一个火焰图来发现时间花在哪里(例如哪个JS函数?是否由于布局而导致?)。