5.9 测定代码执行时间
R提供了两种评估代码性能的方法,一是使用system.time()输出函数运行时间输出,二是使用Rprof()函数生成更精细的评估报告。
5.9.1 测定命令语句执行时间
system.time()用于测定参数给出命令的执行时间
#测定代码执行时间#
#计算1~n数字之和
sum_to_n <- function(n) {
sum <- 0
for (i in 1:n) {
sum <- sum + i
}
return(sum)
}
system.time(sum_to_n(10000))
system.time(sum_to_n(100000))
system.time(sum_to_n(1000000))
运行结果:
system.time()函数输出的执行时间由user time、system time、elapsed time三部分组成。
user time:执行程序代码本身耗费的时间。
system time:程序调用操作系统的命令时,操作系统执行命令耗费的时间。
elapsed time:执行代码所需的总时间。
#读写文件的执行时间
x <- matrix(1:(10000*10000), ncol = 10000)
system.time(save(x, file = "x.RData"))
system.time(load(file = "x.RData"))
运行结果:
与计算1~n数字之和的函数不同。读写文件耗费的system time比较多。读写文件时,R环境会大量调用操作系统的功能,从而导致耗费的system time 增加。
测定代码的执行时间,可以对多种实现方案进行评估,从中选出性能最好的。比如使用system.time()函数测试rbind()与rbindlist()性能,最终得出“rbindlist()性能更胜一筹”。
5.9.2 代码性能测试
Rprof()函数用于更精细地评估代码的执行性能。prof是Profiling的缩写,在软件工程中表示评估程序的动态性能,即评估程序对内存、CPU的使用量,常称为“代码性能测试”(code Profiling)。
add_one <- function(val) {
return(val + 1)
}
add_one_to_vec <- function(x) {
for (i in seq_along(x)) {
x[i] <- add_one(x[i])
}
return(x)
}
Rprof("add_one.out")
x <- add_one_to_vec(1:1000000)
head(x)
Rprof(NULL)
summaryRprof("add_one.out")
self.time列出了各函数的执行时间,执行add_one函数耗费了0.24s,执行add_one_to_vec()函数耗费了0.62s。通过self.pct列可知各函数的self.time占代码总体运行时间的比例。total.time指各函数代码的执行时间与执行相关函数调用的其他函数所耗费的时间之和。add_one_to_vec()函数内部代码耗费了0.62s,而它又调用了add_one,所以还要额外耗费0.24s,于是,add_one_to_vec()函数的total.time为0.62 + 0.24 = 0.86s。