Rcpp等效的lineprof

时间:2015-05-11 16:23:29

标签: r performance profiling rcpp

R中的lineprof包对于分析函数的哪些部分占用时间和分配/释放内存非常有用。

Rcpp是否有lineprof()个等同物?

我目前使用std::chrono::steady_clock等来获取Rcpp函数中的块时间。备择方案? Rstudio IDE在这里提供了一些帮助吗?

2 个答案:

答案 0 :(得分:2)

查看高性能计算的任何体面介绍,例如my talks page的(较旧)演示文稿中的一些幻灯片,其中包括KCacheGrind(KDE前端到Valgrind的一部分)的工作示例以及Google Perftools

从更抽象的意义上讲,你需要接受C ++!= R这一事实,而不是所有工具都有相同的对应物。特别是Rprof,用于分析构建的几个CRAN包的R profiler基于R 解释的事实。 C ++不是,所以情况会有所不同。但是编译的分析与编译和调试一样古老,所以你会发现很多教程。

答案 1 :(得分:2)

补充@ Dirk的答案......

如果您正在使用OS X,Time Profiler Instrument是Apple的Instruments一套检测工具的一部分,那就是优秀的采样分析器。

只是为了解决问题:

  • 采样分析器可让您回答问题,我的程序在执行时花费的代码路径是什么?

  • 一个(完整的)缓存分析器可以让您回答问题,这是我程序中最常执行的代码路径吗?

这些是不同的问题 - 您的最热门代码路径已经足够优化,即使在该路径中执行的指令总数非常高,执行它们所需的时间也可能是这样。相对较低。

如果您想使用工具来分析R包中使用的C ++代码/例程,最简单的方法是:

  1. 使用适当的命令行参数创建一个指向R可执行文件的目标,以运行您想要分析的任何函数:
  2. instruments-target

    1. 设置命令行参数以运行将执行C ++例程的代码 - 例如,此代码运行(function() { 'use strict'; function MainController($scope, $location, $anchorScroll) { $scope.doneLoading = false; $scope.hasPageLoadError = false; $scope.pageLoadErrorMsg = ""; console.log("getting main"); $scope.scrollTo = function(id) { $location.hash(id); //console.log($location.hash()); $anchorScroll(); }; $scope.doneLoading = true; } myApp.controller("MainController", MainController); ,以检测所有Rcpp:::test()测试代码:
    2. instruments-arguments

      1. 点击红色的大红色按钮,然后离开!
      2. 我会将理解乐器和时间分析器中的其余说明留给google-fu +文档,但是(如果你是在OS X上)你应该知道这个工具。