从Rprof()中获取更多信息

6

我一直在试图研究我写的一些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
...

有没有办法深入挖掘,找出哪些具体的$<-.data.frameFUN(可能是来自by())的调用实际上是罪魁祸首?还是说我需要重新设计代码,并制作更小的功能块以获得更精细的结果?
我之所以抗拒重新设计,是因为我必须将数据结构传递到函数中,而所有传递都是按值传递,所以这似乎是朝错误的方向迈出的一步。
谢谢。
3个回答

4
现有的 CRANprofrproftools 对此很有用。后者可以使用 Rgraphviz,但不总是可安装的。 R Wiki页面关于性能分析 有额外的信息和 Romain 的一个好脚本,也可以可视化(但需要 graphviz)。

网址失效了,也许现在应该在这里:http://rwiki.sciviews.org/doku.php?id=tips:misc:profiling。 - hhh

2

Rprof会在时间间隔内对调用堆栈进行采样 - 这是好消息。

我会获取它收集的原始堆栈样本(stackshots),并随机挑选几个样本进行检查。我要寻找的是出现在多个样本中的调用点(不仅仅是函数,还包括一个函数调用另一个函数的位置)。例如,如果一个调用点在50%的样本中出现,则其成本为50%,因为其可能的删除将节省大约50%的总时间。(听起来很明显,对吧?但这不是众所周知的。)

并非每个代价高昂的调用点都可以优化,但有些可以,除非程序已经尽可能快了。

(不要被诸如需要查看多少样本之类的问题所分心。如果某些东西能够为您节省合理比例的时间,则它会出现在相似比例的样本中。确切的数字并不重要。重要的是您找到它。同时也不要被图形、递归、计时和计数问题所分心。重要的是,对于您看到的每个调用点,显示它的堆栈样本的比例。)


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接