【问题标题】:Getting more info from Rprof()从 Rprof() 获取更多信息
【发布时间】:2011-01-05 17:29:36
【问题描述】:

我一直在尝试深入研究我编写的一些 R 代码中的时间猪,所以我使用了Rprof。虽然输出还不是很有帮助:

> summaryRprof()
$by.self
                      self.time self.pct total.time total.pct
"$<-.data.frame"           2.38     23.2       2.38      23.2
"FUN"                      2.04     19.9      10.20      99.6
"[.data.frame"             1.74     17.0       5.54      54.1
"[.factor"                 1.42     13.9       2.90      28.3
...

有没有办法深入挖掘,找出$&lt;-.data.frameFUN(可能来自by())等的具体调用实际上是罪魁祸首?或者我是否需要重构代码并制作更小的功能块以获得更细粒度的结果?

我反对重构的唯一原因是我必须将数据结构传递给函数,而所有传递都是按值传递的,所以这似乎是朝着错误方向迈出的一步。

谢谢。

【问题讨论】:

    标签: r profiling


    【解决方案1】:

    现有的CRANprofrproftools 对此很有用。后者可以使用并非总是可安装的 Rgraphviz。

    R Wiki page on profiling 有额外的信息和一个由 Romain 编写的漂亮脚本,它也可以可视化(但需要 graphviz)。

    【讨论】:

    • 网址坏了,现在可能是这个here
    【解决方案2】:

    解析Rprof 生成的输出并不难,然后您就可以访问所有内容。

    【讨论】:

      【解决方案3】:

      Rprof 每隔一段时间对调用堆栈进行采样 - 这是个好消息。

      我要做的是访问它收集的原始堆栈样本 (stackshots),然后随机挑选几个并检查它们。我正在寻找的是出现在多个样本上的调用站点(不仅仅是函数,还有一个函数调用另一个函数的地方)。例如,如果一个调用站点出现在 50% 的样本上,那么这就是它的成本,因为它可能的删除将节省大约 50% 的总时间。 (看起来很明显,对吧?但它并不为人所知。)

      并非每个昂贵的调用站点都可以优化,但有些是可优化的,除非程序已经尽可能快。

      (不要被您需要查看多少样本等问题分心。如果某项内容可以为您节省合理的时间,那么它会出现在类似的样本中。确切的数字不会重要。重要的是你找到它。也不要被图形和递归以及时间测量和计数问题分心。重要的是,对于你看到的每个调用站点,显示它的堆栈样本的比例。)

      【讨论】:

        猜你喜欢
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        • 2018-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-30
        • 2011-01-13
        相关资源
        最近更新 更多