我一直在努力深入研究我编写的一些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.frame
和FUN
(可能来自by()
)的具体调用,等等实际上是罪魁祸首?或者我是否需要重构代码并制作更小的功能块以获得更细粒度的结果?
我拒绝重构的唯一原因是我必须将数据结构传递给函数,并且所有传递都是按值进行的,所以这似乎是向错误方向迈出的一步。
感谢。
答案 0 :(得分:4)
现有的CRAN包profr和proftools对此非常有用。后者可以使用并不总是可安装的Rgraphviz。
R Wiki page on profiling有额外的信息和Romain的一个很好的脚本,它也可以显示(但需要graphviz)。
答案 1 :(得分:2)
Rprof 会按时间间隔对调用堆栈进行采样 - 这是个好消息。
我要做的是访问它收集的原始堆栈样本(stackshots),并随机选择几个并检查它们。我正在寻找的是多个样本上出现的调用站点(不仅仅是函数,而是一个函数调用另一个函数的位置)。例如,如果一个呼叫站点出现在50%的样本上,那就是它的成本,因为它的可能删除将节省大约50%的总时间。 (看起来很明显,对吗?但它并不为人所知。)
并非每个昂贵的呼叫站点都是可优化的,但有些是,除非该程序已经尽可能快。
(不要因为需要查看多少样本等问题而分心。如果某些事情会节省一段合理的时间,那么它会出现在相似的样本部分上。确切的数字不会重要的是你找到了它。也不要被图形和递归以及时间测量和计数问题分心。重要的是,对于你看到的每个调用站点,显示它的堆栈样本的比例。)
答案 2 :(得分:0)
解析Rprof
生成的输出并不太难,然后您就可以访问所有内容。