Performance 如何分析特定函数在R中运行的时间长度
我刚刚得到一份工作,通过提高用于计算数据的算法的效率来帮助R中的程序加速。有许多循环进行不同的计算,我想知道哪些循环最终使用了最多的资源。我想知道如何计算循环完成所需的时间。我可以利用这些信息来找出要优化的算法,甚至可以编写一个C扩展来处理计算。您可以使用:Performance 如何分析特定函数在R中运行的时间长度,performance,r,profiling,benchmarking,bioinformatics,Performance,R,Profiling,Benchmarking,Bioinformatics,我刚刚得到一份工作,通过提高用于计算数据的算法的效率来帮助R中的程序加速。有许多循环进行不同的计算,我想知道哪些循环最终使用了最多的资源。我想知道如何计算循环完成所需的时间。我可以利用这些信息来找出要优化的算法,甚至可以编写一个C扩展来处理计算。您可以使用: Sys.time()或system.time() rbenchmark包 microbenchmark包 或探查器(例如,?RProf) 您可以使用: Sys.time()或system.time() rbenchmark包 micro
或Sys.time()
system.time()
包rbenchmark
包microbenchmark
- 或探查器(例如,
)?RProf
或Sys.time()
system.time()
包rbenchmark
包microbenchmark
- 或探查器(例如,
)?RProf
tapply
vsby
vs数据进行比较。表
:根据注释编辑
这里是一个使用基准的示例,使用
tapply
vsby
vs数据进行比较。表
:根据注释编辑
我用
Rprof
告诉你去哪里找。
它生成了一个堆栈样本文件,我只看了其中的一小部分,比如随机选择的10个。
或者我只是让样本之间的时间足够大,这样我就不会有太多的样本开始
这有两个原因
1) 通过亲自检查单个堆栈样本,您可以看到简单统计数据无法暴露的问题,因为通过查看堆栈,您可以看到为什么要执行这些操作。这告诉你是否可以摆脱它,这是最基本的信息
2) 如果您看到这样一种可以改进的活动模式,您只需在多个示例上看到它,就知道它值得修复。
所有额外的样本,如果它们意味着你不能做(1),实际上是有害的。我用
Rprof
告诉你去哪里找。
它生成了一个堆栈样本文件,我只看了其中的一小部分,比如随机选择的10个。
或者我只是让样本之间的时间足够大,这样我就不会有太多的样本开始
这有两个原因
1) 通过亲自检查单个堆栈样本,您可以看到简单统计数据无法暴露的问题,因为通过查看堆栈,您可以看到为什么要执行这些操作。这告诉你是否可以摆脱它,这是最基本的信息
2) 如果您看到这样一种可以改进的活动模式,您只需在多个示例上看到它,就知道它值得修复。
所有额外的样本,如果它们意味着你不能做(1),实际上是有害的。所有的
表达式是怎么回事。我喜欢将它们保存为表达式,以便在所有测试中轻松更改输入。(另外,我发现它在test
列中提供了更好的输出)benchmark(使用.tapply=tappyl(x[,1],x[,“f”],mean),使用.by=by(x[,1],x[,“f”],mean),使用.dtable=dt[,mean(col1),by=key(dt)],replications=10,order='relative')
。。。无论x
和dt
是什么,只要将..
参数命名为:基准测试(使用.tapply=tapply(x[,1],x[,“f”],mean))
。将每个测试放在自己的行上。然后您可以轻松地添加/删除它们。使用expression
时,我看到的最大问题是,你可能会把看你的代码的人弄糊涂。所有expression
s有什么用?@GSee。我喜欢将它们保存为表达式,以便在所有测试中轻松更改输入。(另外,我发现它在test
列中提供了更好的输出)benchmark(使用.tapply=tappyl(x[,1],x[,“f”],mean),使用.by=by(x[,1],x[,“f”],mean),使用.dtable=dt[,mean(col1),by=key(dt)],replications=10,order='relative')
。。。无论x
和dt
是什么,只要将..
参数命名为:基准测试(使用.tapply=tapply(x[,1],x[,“f”],mean))
。将每个测试放在自己的行上。然后您可以轻松地添加/删除它们。使用expression
时,我看到的最大问题是,您可能会混淆查看代码的其他人。您是否按顺序列出了他们?对于第一个要点,您可以使用beg Thank you,这非常有帮助!您是否按顺序列出了它们?对于第一个要点,您可以使用乞求谢谢,这非常有帮助!
library(rbenchmark)
# Different tests being compared
benchmark( using.tapply = tapply(x[, 1], x[, "f"], mean),
using.by = by(x[, 1], x[, "f"], mean),
using.dtable = dt[,mean(col1),by=key(dt)]),
# Number of reps. How results are.
replications = 250, order = "relative"
)
#------------------------#
# RESULTS #
#------------------------#
# COMPARING data.table VS tapply VS by #
#------------------------------------------#
# test elapsed relative
# 2 using.dtable 0.168 1.000
# 1 using.tapply 2.396 14.262
# 3 using.by 8.566 50.988