如何分析R软件包的加载

时间:2019-07-16 09:27:52

标签: r profiling r-package

我已经写了这个R包,需要花费很多时间(> 10s,有时长达20-30s!)

每次加载软件包时,例如在步骤"** testing if installed package can be loaded"上构建软件包或直接调用library("my.package")时,20秒钟都不会发生任何事情。

这使开发过程中的所有事情都非常缓慢:构建文档,构建软件包,运行R检查...

我当然有怀疑(看着你,狡猾的依赖性),但我需要在消除之前收集证据。

是否有一种方法可以分析包裹的装载情况,以便找出原因?或更笼统地说,我如何弄清楚到底发生了什么?

2 个答案:

答案 0 :(得分:2)

因此,使用@ davide-lorino的detach方法存在的一个问题是,如果纠缠了dependsimports,它将失败,并且很难失败。

更好的方法是使用一个future后端,它在干净的R会话中加载每个import,并花费多长时间通过library加载它们。 / p>

我在一个可能对其他人有用的软件包中实现了此目的:https://github.com/rmflight/importedPackageTimings

答案 1 :(得分:0)

您可以通过对调用测试基准来加载哪个库,以确定哪个库需要最长的加载时间。

关键是要确保卸载库。如果在重新加载库之前保持它们已加载,则library()函数将确定该库已加载并返回。在典型的100次运行基准测试中,其中1个代表加载库所需的时间,其余99个代表library()确定加载库所花费的时间。然后,结果(持续时间)将是100次运行的总和,得出的结果很小,结果之间几乎没有差异,就像这样:

enter image description here

当您真正想要的东西看起来像:

enter image description here

为我们的努力提供了不那么令人惊讶的结果。

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)
  }
}