如何分析 Rcpp 代码(在 linux 上)

How to profile Rcpp code (on linux)

我用 Rcpp 制作了一个 R 包,其中整个模拟在 c++ 中 运行,结果在 R 中分析。现在我需要分析我的函数以便优化它们,但 R 分析器无法区分C++ 函数内部发生了什么,我不知道如何 运行 当函数只能是 运行 来自 R 内部时的 C++ 分析器。

到目前为止,我找到了一些使用 gperftools 的建议 (questions and tutorials),但指南不完整(也许他们假定我缺乏一定程度的知识?),缺少链接,我保留 运行宁入墙。因此这个问题。这是我所在的位置:

  1. 安装 gperftools(我使用 pacman 从 extra/gperftools 安装)
  2. 在 C++ 头文件中包含 gperftools/profiler.h
  3. 在 C++ 代码中围绕我要分析的内容添加 ProfilerStart("myprof.log") 和 ProfilerStop()
  4. 使用 -lprofiler 编译
  5. 运行 "$CPUPROFILE="myprof.log" R -f myscript.R"

当前的墙是 gcc 告诉我的 "Undefined Symbol: ProfilerStart",所以我认为链接有问题?

我对 gperftools 印象不是很深刻。此外,它似乎是一个检测分析器,基于采样的分析器更易于使用并且可能 运行 更快。英特尔的 VTune 是一款出色的基于采样的分析器,如果您是教育用户,可以免费使用。即使您没有,您的组织也可能已经拥有许可证。

关于您的 gperftools 问题,是的,这是一个 linker 问题。由于您决定不共享任何相关信息(link 命令?编译命令?实际错误消息?)我们无法进一步帮助您。

毕竟是链接错误,是我第一次使用Makevars,经验不足造成的。 在步骤 #4 中,我将“-lprofiler”添加到 PKG_CXXFLAGS,用于编译,而我本应将其添加到 PKG_LIBS。我进行了更改,现在分析器工作正常。这是我的 Makevars:

PKG_CXXFLAGS += -Wall -pedantic -g -ggdb #-fno-inline-small-functions PKG_LIBS += -lprofiler CXX_STD = CXX11