1

当使用 Rprof 类型的函数对 R 代码进行分析时,我们会得到单独花在函数上的时间以及花在函数和被调用者上的时间。然而,据我所知,我们没有得到给定函数被评估的次数。

例如,假设我想比较两个积分函数:

integrate_1(myfunc, from = -Inf, to = Inf)
integrate_2(myfunc, from = -Inf, to Inf)

我可以很容易地看到每个函数花费了多少时间以及这些时间花在了哪里,但我不知道如何检查在每个集成函数中必须对 myfunc 进行多少次评估。

谢谢,

4

2 回答 2

1

实现 Joran 的计数器方法的一种方法是使用该trace函数。

例如,首先我们将计数器设置为零。(为方便起见,在全局环境中分配。)

count <- 0

然后设置跟踪。在这里,我们在identity函数上设置它(它只返回您输入给它的值)。

trace("identity", quote(count <<- count + 1), print = FALSE)

现在,无论何时identity调用, 的值count都会增加。 print = FALSE只是在调用函数时停止将消息打印到控制台。

让我们多次调用该函数并检查计数:

for(i in seq_len(123)) identity(1)
count
## [1] 123
于 2013-09-27T15:12:15.940 回答
0

Rprof通过在计时器上对调用堆栈进行采样来工作。它不计算调用次数。

它将采样的调用堆栈记录在一个文件中,尽管它不记录调用发生的行号,但这些示例对于查看导致花费时间的原因仍然很有用。

例如,如果您碰巧查看 M 个随机样本,并且您看到一个模式,如 A 调用 B 调用 C 对其中 N 个样本,那么您知道程序花费大约 N/M 的时间来做这件事(假设 N > 1 )。如果你看到这样的事情,并且你可以想办法避免它的一部分,你将节省总时间的很大一部分。

Rprof附带一个汇总工具,可以为您提供您提到的那种数字,但我发现这些数字无论如何都没有用。我更愿意真正了解正在发生的事情。

于 2013-09-27T19:28:04.380 回答