Let’s solve the problem but let’s not make it worse by guessing. —Gene Kranz, Apollo13 Lead Flight Director. 带着策略解决问题,而不是盲目猜测问题的所在

1. system.time()

作用:测试某个函数或者代码块运行时间,实用于已经知道哪一块代码运行问题 返回 pro_time 类对象,包含 user timeelapsed time 区别是: 两类时间区别

两类时间区别

Elapsed time > user time
system.time(readLines("http://baidu.com"))#花费更多的时间连接网站,而不是cpu处理上
##    user  system elapsed 
##    0.02    0.00    0.07

memoise缓存处理包

memoise 是一个非常简单的缓存包,以本地为基础,减少重复计算。当以相同的参数对同一个函数执行第二次计算的时候,可以直接用第一次计算过的结果作为计算结果。主要接口函数有memoizeforget

library(memoise)
## Warning: package 'memoise' was built under R version 3.4.4
func1 <- memoise(function(){
    Sys.sleep(1)
    runif(1)
}
)
system.time(func1())
##    user  system elapsed 
##       0       0       1
system.time(func1())#第二次在对这个相同表达式求解不需要话时间
##    user  system elapsed 
##    0.03    0.00    0.03
forget(func1) #清除缓存
## [1] TRUE
system.time(func1)
##    user  system elapsed 
##       0       0       0

2. Rprof() & summaryRprof()

Rprof()函数用于打印函数的调用关系和cpu的耗时数据,然后通过summaryRprof函数分析数据产生性能报告($by.total$by.self),左后使用profr库中的plot()函数可视化。

实例1:股票数据分析案例

bidpx1<-read.csv(file="000000_0.txt",header=FALSE) #读取数据

#交易日期、交易时间、股票ID、买一价、买一量、卖一价、卖一量。
names(bidpx1)<-c("tradedate","tradetime","securityid",
                 "bidpx1","bidsize1","offerpx1","offersize1")
bidpx1$securityid<-as.factor(bidpx1$securityid) #将彩票id转化成因子
head(bidpx1) #查看前6行
##   tradedate tradetime securityid bidpx1 bidsize1 offerpx1 offersize1
## 1  20130724    145004     131810  2.620     6960    2.630      13000
## 2  20130724    145101     131810  2.860    13880    2.890       6270
## 3  20130724    145128     131810  2.850   327400    2.851       1500
## 4  20130724    145143     131810  2.603    44630    2.800      10650
## 5  20130724    144831     131810  2.890    11400    3.000      77990
## 6  20130724    145222     131810  2.600  1071370    2.601      35750
object.size(bidpx1) #查看文件大小
## 1299920 bytes
#以股票ID分组计算每小时买一价的平均值和买一量的总量
library(plyr)
fun1<-function(){
    datehour<-paste(bidpx1$tradedate, #paste("20130724", "14")
                    substr(bidpx1$tradetime,1,2),sep="") 
    df<-cbind(datehour,bidpx1[,3:5]) #按列合并
    ddply(bidpx1,.(securityid,datehour),summarize,price = mean(bidpx1),size = sum(bidsize1)) 
}
head(fun1())
##   securityid   datehour    price      size
## 1     131810 2013072210 3.445549 189670150
## 2     131810 2013072211 3.437179 131948670
## 3     131810 2013072212 3.421000       920
## 4     131810 2013072213 3.509442 299554430
## 5     131810 2013072214 3.578667 195130420
## 6     131810 2013072215 1.833000    718940
system.time(fun1()) #以system.time()查看fun1函数运行时间
file<-"fun1_rprof.out" #定义性能日志函数的输出文件位置
Rprof(file) #开始性能监控
fun1() #执行计算函数
##    securityid   datehour     price      size
## 1      131810 2013072210  3.445549 189670150
## 2      131810 2013072211  3.437179 131948670
## 3      131810 2013072212  3.421000       920
## 4      131810 2013072213  3.509442 299554430
## 5      131810 2013072214  3.578667 195130420
## 6      131810 2013072215  1.833000    718940
## 7      131810 2013072291  3.065455    491000
## 8      131810 2013072292  3.026667   2227990
## 9      131810 2013072293  3.330828  37514930
## 10     131810 2013072294  3.338376  20283800
## 11     131810 2013072295  3.342809  38649440
## 12     131810 2013072310  3.830267 237682910
## 13     131810 2013072311  3.936353 119724960
## 14     131810 2013072312  3.990000     58800
## 15     131810 2013072313  4.068245 214767910
## 16     131810 2013072314  3.543290 158247180
## 17     131810 2013072393  3.761250    271620
## 18     131810 2013072394  3.773298  40314570
## 19     131810 2013072395  3.737437  35177690
## 20     131810 2013072410  4.361410 259186900
## 21     131810 2013072411  4.397561  71576130
## 22     131810 2013072412  4.440000      2340
## 23     131810 2013072413  4.330937 151206420
## 24     131810 2013072414  3.475491 169496740
## 25     131810 2013072492  3.000000    379020
## 26     131810 2013072493  4.203207  44831440
## 27     131810 2013072494  4.375304  27003880
## 28     131810 2013072495  4.294196  75757040
## 29     131810 2013072510 10.829361 187127520
## 30     131810 2013072511 10.522720  70739720
## 31     131810 2013072513  9.188874 148373360
## 32     131810 2013072514  8.969589 140509850
## 33     131810 2013072595  9.951193  64061440
## 34     131810 2013072610  6.286461 169360480
## 35     131810 2013072611  6.306957 115884190
## 36     131810 2013072613  5.945383 268580750
## 37     131810 2013072614  7.369312 320091580
## 38     131810 2013072692  4.680000    865470
## 39     131810 2013072693  5.575728 154505050
## 40     131810 2013072694  6.218843  44064260
## 41     131810 2013072695  6.271617  24524560
## 42     204001 2013072210  3.534034  40347200
## 43     204001 2013072211  3.559335  25029600
## 44     204001 2013072213  3.578888  66225000
## 45     204001 2013072214  3.644361  66401000
## 46     204001 2013072215  0.000000         0
## 47     204001 2013072291  2.993333    667400
## 48     204001 2013072292  3.119804   3690000
## 49     204001 2013072293  3.454435   9431800
## 50     204001 2013072294  3.470826   9187000
## 51     204001 2013072295  3.463120   5223300
## 52     204001 2013072310  3.904744  54618200
## 53     204001 2013072311  4.023328  35100800
## 54     204001 2013072313  4.211417  54181500
## 55     204001 2013072314  3.623404  56021700
## 56     204001 2013072393  3.775000     57600
## 57     204001 2013072394  3.772265   6070400
## 58     204001 2013072395  3.751387   6995800
## 59     204001 2013072410  4.433898  43408000
## 60     204001 2013072411  4.491526  28419400
## 61     204001 2013072413  4.341446  47058300
## 62     204001 2013072414  3.544172  39087400
## 63     204001 2013072492  3.750000    358500
## 64     204001 2013072493  4.248534   8846100
## 65     204001 2013072494  4.414348   4763900
## 66     204001 2013072495  4.453596  11579700
## 67     204001 2013072510 11.183619  46916400
## 68     204001 2013072511 10.608099  16110300
## 69     204001 2013072513  9.330178  29484900
## 70     204001 2013072514  9.531541  41721100
## 71     204001 2013072595 10.114272  10037100
## 72     204001 2013072610  6.293475  57224000
## 73     204001 2013072611  6.305592  30969900
## 74     204001 2013072613  6.017185  54548000
## 75     204001 2013072614  7.884802  50368400
## 76     204001 2013072692  5.200000    441400
## 77     204001 2013072693  5.718964  10008500
## 78     204001 2013072694  6.520219  13391400
## 79     204001 2013072695  6.531557  14724000
Rprof(NULL) #停止执行监控,并输出文件
summaryRprof(file) #通过summaryRprof函数解析这个监控文件
## $by.self
##             self.time self.pct total.time total.pct
## ".External"      0.06    50.00       0.06     50.00
## "$"              0.02    16.67       0.02     16.67
## "mean"           0.02    16.67       0.02     16.67
## "paste"          0.02    16.67       0.02     16.67
## 
## $by.total
##                       total.time total.pct self.time self.pct
## "block_exec"                0.12    100.00      0.00     0.00
## "call_block"                0.12    100.00      0.00     0.00
## "knitr::knit"               0.12    100.00      0.00     0.00
## "process_file"              0.12    100.00      0.00     0.00
## "process_group"             0.12    100.00      0.00     0.00
## "process_group.block"       0.12    100.00      0.00     0.00
## "rmarkdown::render"         0.12    100.00      0.00     0.00
## "withCallingHandlers"       0.12    100.00      0.00     0.00
## ".External"                 0.06     50.00      0.06    50.00
## "<Anonymous>"               0.04     33.33      0.00     0.00
## "dev.off"                   0.04     33.33      0.00     0.00
## "eval"                      0.04     33.33      0.00     0.00
## "evaluate"                  0.04     33.33      0.00     0.00
## "evaluate_call"             0.04     33.33      0.00     0.00
## "fun1"                      0.04     33.33      0.00     0.00
## "handle"                    0.04     33.33      0.00     0.00
## "in_dir"                    0.04     33.33      0.00     0.00
## "timing_fn"                 0.04     33.33      0.00     0.00
## "withVisible"               0.04     33.33      0.00     0.00
## "$"                         0.02     16.67      0.02    16.67
## "mean"                      0.02     16.67      0.02    16.67
## "paste"                     0.02     16.67      0.02    16.67
## ".Call"                     0.02     16.67      0.00     0.00
## ".fun"                      0.02     16.67      0.00     0.00
## "chunk_device"              0.02     16.67      0.00     0.00
## "ddply"                     0.02     16.67      0.00     0.00
## "dev_new"                   0.02     16.67      0.00     0.00
## "do.call"                   0.02     16.67      0.00     0.00
## "ldply"                     0.02     16.67      0.00     0.00
## "llply"                     0.02     16.67      0.00     0.00
## "loop_apply"                0.02     16.67      0.00     0.00
## 
## $sample.interval
## [1] 0.02
## 
## $sampling.time
## [1] 0.12

可视化工具profvis

# install.packages("profvis")
library(profvis)
## Warning: package 'profvis' was built under R version 3.4.4
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 3.4.3
p <- profvis({          
  data(diamonds, package = "ggplot2")           
  plot(price ~ carat, data = diamonds)          
  m <- lm(price ~ carat, data = diamonds)           
  abline(m, col = "red")            
})

htmlwidgets::saveWidget(p, "title.html") #可以保存到工作空间下html文件

title.html type “p” in console

参考阅读: