2

我可以使用 gperftools 来生成调用图,例如这个问题

现在我想bind_rows()dplyrR 包中获取一个调用图,以便追踪这个错误

我编译了两者Rdplyr使用CPP/CXXFLAGS=-g -fvar-tracking-assignmentsand LDFLAGS=-lprofiler -lunwind

当我运行以下命令时:

CPUPROFILE="samples.log" R --vanilla <<< "library(dplyr)
ll = lapply(1:1e5, function(x) as.list(setNames(runif(5), letters[1:5])))
print(system.time(bind_rows(ll)))"

pprof --gif /usr/lib/R/bin/exec/R samples.log > out.gif

我得到的是:

在此处输入图像描述

如何获取调用层次结构,以便知道dplyr绑定行文件中的哪个调用是瓶颈?

编辑:似乎该--focus选项是我在这里需要的。但是如何将它连接到RecursiveRelease

pprof --focus=rbind__impl --gif /usr/lib/R/bin/exec/R samples.log > out.gif

在此处输入图像描述

编辑:用 重新编译 Rcpp 并-g与 链接后-lprofiler,我可以得到以下信息: flame.svg,其中 8% 获得了良好的堆栈跟踪,但大部分仍然没有。-lprofiler这可能是因为某些库是在没有支持加载的

4

0 回答 0