如何分析 R 包的加载
How to profile the loading of an R package
我编写的这个 R 包需要很长时间(> 10 秒,有时长达 20-30 秒!)才能加载。
每次加载包时,比如在步骤"** testing if installed package can be loaded"
构建包时,或者直接调用library("my.package")
,20s没有任何反应。
这使得开发过程中的一切都非常缓慢:构建文档、构建包、运行 R 检查...
当然我有我的怀疑(看着你,狡猾的依赖),但我需要在砍掉它之前收集证据。
有没有办法分析包的加载情况,以确定原因?或者更一般地说,我怎样才能弄清楚引擎盖下发生了什么?
您可以通过对加载您正在测试的每个库的调用进行基准测试来确定哪个库加载时间最长。
关键是确保卸载库。如果在重新加载之前保持库已加载,library()
函数将确定库已加载并 return 退出。在 100 次运行的典型基准测试中,其中 1 次将代表加载库所花费的时间,其余 99 次将代表 library()
确定库已加载所花费的时间。结果(持续时间)将是 100 次运行的总和,产生非常小的数字并且结果之间几乎没有差异,如下所示:
当您真正想要的东西看起来更像是:
我们的努力给了我们一个不那么令人惊讶的结果。
P.s。 detach_package()
函数是这样实现的:
detach_package <- function(pkg, character.only = FALSE)
{
if(!character.only)
{
pkg <- deparse(substitute(pkg))
}
search_item <- paste("package", pkg, sep = ":")
while(search_item %in% search())
{
detach(search_item, unload = TRUE, character.only = TRUE)
}
}
所以使用@davide-lorino 的 detach 方法的一个问题是,如果有纠缠 depends
或 imports
,它会失败,并且很难失败。
更好的方法是使用 future
后端在干净的 R 会话中加载每个 import
,并计算通过 library
加载它们需要多长时间.
我在一个可能对其他人有用的包中实现了这个:https://github.com/rmflight/importedPackageTimings
我编写的这个 R 包需要很长时间(> 10 秒,有时长达 20-30 秒!)才能加载。
每次加载包时,比如在步骤"** testing if installed package can be loaded"
构建包时,或者直接调用library("my.package")
,20s没有任何反应。
这使得开发过程中的一切都非常缓慢:构建文档、构建包、运行 R 检查...
当然我有我的怀疑(看着你,狡猾的依赖),但我需要在砍掉它之前收集证据。
有没有办法分析包的加载情况,以确定原因?或者更一般地说,我怎样才能弄清楚引擎盖下发生了什么?
您可以通过对加载您正在测试的每个库的调用进行基准测试来确定哪个库加载时间最长。
关键是确保卸载库。如果在重新加载之前保持库已加载,library()
函数将确定库已加载并 return 退出。在 100 次运行的典型基准测试中,其中 1 次将代表加载库所花费的时间,其余 99 次将代表 library()
确定库已加载所花费的时间。结果(持续时间)将是 100 次运行的总和,产生非常小的数字并且结果之间几乎没有差异,如下所示:
当您真正想要的东西看起来更像是:
我们的努力给了我们一个不那么令人惊讶的结果。
P.s。 detach_package()
函数是这样实现的:
detach_package <- function(pkg, character.only = FALSE)
{
if(!character.only)
{
pkg <- deparse(substitute(pkg))
}
search_item <- paste("package", pkg, sep = ":")
while(search_item %in% search())
{
detach(search_item, unload = TRUE, character.only = TRUE)
}
}
所以使用@davide-lorino 的 detach 方法的一个问题是,如果有纠缠 depends
或 imports
,它会失败,并且很难失败。
更好的方法是使用 future
后端在干净的 R 会话中加载每个 import
,并计算通过 library
加载它们需要多长时间.
我在一个可能对其他人有用的包中实现了这个:https://github.com/rmflight/importedPackageTimings