Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 防止R_Performance_R_Testing - Fatal编程技术网

Performance 防止R

Performance 防止R,performance,r,testing,Performance,R,Testing,在R包中检测性能回归的好工作流是什么?理想情况下,我正在寻找与R CMD check集成的东西,当我在代码中引入了显著的性能回归时,它会提醒我 一般来说,什么是好的工作流?其他哪些语言提供了好的工具?它是可以在顶级单元测试的基础上构建的,还是通常单独进行的?这里做任何事情的唯一方法就是做一些假设。因此,让我们假设机器没有改变,否则需要“重新校准” 然后使用类似于单元测试的框架,并将“必须在X个时间单位内完成”视为需要满足的另一个测试标准。换句话说,做一些像 stopifnot( timingO

在R包中检测性能回归的好工作流是什么?理想情况下,我正在寻找与
R CMD check
集成的东西,当我在代码中引入了显著的性能回归时,它会提醒我


一般来说,什么是好的工作流?其他哪些语言提供了好的工具?它是可以在顶级单元测试的基础上构建的,还是通常单独进行的?

这里做任何事情的唯一方法就是做一些假设。因此,让我们假设机器没有改变,否则需要“重新校准”

然后使用类似于单元测试的框架,并将“必须在X个时间单位内完成”视为需要满足的另一个测试标准。换句话说,做一些像

 stopifnot( timingOf( someExpression ) < savedValue plus fudge)
stopifnot(计时(someExpression)
因此,我们必须将先前的计时与给定的表达式相关联。也可以使用来自现有三个单元测试包中任何一个的相等性测试比较


没有什么是哈德利不能处理的,所以我想我们几乎可以期待在下一次长时间的学术休息之后有一个新的包
timr
:)。当然,这必须是可选的,因为在一台“未知”的机器上(想想:CRAN测试包装),我们没有参考点,否则福吉因子必须“转到11”才能在新机器上自动接受。

R-devel提要上最近宣布的一项更改可能会给出一个粗略的衡量标准

R-devel实用程序的变化

“R CMD check”可以选择报告检查各个部分的计时:这由“编写R扩展”中记录的环境变量控制

可以检查运行测试所花费的总时间,并将其与以前的值进行比较。当然,添加新的测试会增加时间,但是仍然可以看到显著的性能下降,尽管是手动的


这不像单个测试套件中的计时支持那样细粒度,但它也不依赖于任何一个特定的测试套件。

这是一个非常具有挑战性的问题,也是我经常处理的问题,因为我在一个包中交换不同的代码以加快速度。有时,性能回归伴随着算法或实现的变化,但也可能由于所用数据结构的变化而出现

在R包中检测性能回归的好工作流是什么

在我的例子中,我倾向于使用不同的固定数据集来加速非常特定的用例。正如Spacedman所写,拥有一个固定的计算系统很重要,但这几乎是不可行的:有时一台共享的计算机可能有其他进程,即使它看起来相当空闲,也会将速度降低10-20%

我的步骤:

  • 标准化平台(例如,一台或几台机器、特定虚拟机或虚拟机+特定基础设施、la Amazon的EC2实例类型)
  • 将用于速度测试的数据集标准化
  • 创建脚本和固定的中间数据输出(即保存到.rdat文件),其中涉及的数据转换非常少。我的重点是某种建模,而不是数据操作或转换。这意味着我想给建模函数提供完全相同的数据块。但是,如果目标是数据转换,那么请确保预转换/处理的数据在包的不同版本的测试中尽可能接近标准。(有关可用于标准化或加速非焦点计算的记忆、缓存等示例,请参阅。它引用了OP的几个包。)
  • 重复测试多次
  • 相对于固定基准调整结果,例如,执行线性回归、对矩阵排序等的时间。这可以考虑基础设施中的“局部”或瞬态变化,例如可能由于I/O、内存系统、相关软件包等
  • 尽可能仔细地检查分析输出(请参阅以获取一些见解,同时参考OP中的工具)

    理想情况下,我正在寻找与R CMD check集成的东西,当我在代码中引入了显著的性能回归时,它会提醒我

    不幸的是,我没有答案

    一般来说,什么是好的工作流

    对我来说,它非常类似于一般的动态代码测试:输出(本例中的执行时间)是可复制的、最佳的、透明的吗?透明度来自于了解影响总体时间的因素。这就是Mike Dunlavey的建议很重要的地方,但我更愿意进一步,使用测线仪

    关于线条分析器,请参见,其他示例参考Python和Matlab中的选项。检查时钟时间是最重要的,但跟踪内存分配、执行行的次数和调用堆栈深度也是非常重要的

    其他哪些语言提供了好的工具

    几乎所有其他语言都有更好的工具。:)Python和Matlab等解释语言都有很好的工具示例,这些工具可能很熟悉,可以用于此目的。虽然动态分析非常重要,但静态分析有助于确定可能存在一些严重问题的地方。Matlab有一个很好的静态分析器,它可以报告对象(例如向量、矩阵)在循环内部增长的情况。仅仅通过动态分析发现这一点是很糟糕的-您已经浪费了执行时间来发现类似的东西,而且如果您的执行上下文非常简单(例如,只有几次迭代,或者小对象),则通常无法识别

    关于语言不可知的方法,您可以查看:

  • 瓦尔格兰德和卡塞格兰德
  • 监视磁盘I/O、脏缓冲区等
  • 监控RAM(缓存研磨)是有帮助的