简介 这篇快速文章重点介绍 JMH(Java Microbenchmark Harness)。首先,我们熟悉 API 并了解其基础知识。然后,我们将看到在编写微基准测试时应该考虑的一些最佳实践。
在java中使用JMH(Java Microbenchmark Harness)做性能测试 JMH的全称是Java Microbenchmark Harness,是一个open JDK中用来做性能测试的套件
# 安装跑分包 install.packages(c("microbenchmark","profvis")) library(microbenchmark) # 这个包默认运行程序100次,进行基准测试 ,获得微秒级差异 df <- data.frame(v<-1:4,name<-letters[1:4]) microbenchmark(df[3,2], df[3,"name"],df$name[3]) 3] 800 902 1246.00 1001.0 1101.0 19801 100 # 性能测试profvis()把代码包里面就可以啦 library("profvis") library(microbenchmark #apply cs_apply <- function(x){ sapply(x, function(x) sum(1:x)) } # cumsum microbenchmark
(可惜没有tidyverse易用) 测试代码: library(microbenchmark) library(sqldf) library(dplyr) library(data.table) sapply ,n-1L), y2=rnorm(n-1L)) dt1 = as.data.table(df1) dt2 = as.data.table(df2) mb = list() # inner join microbenchmark df2, by = "x"), DT = dt1[dt2, nomatch=NULL, on = "x"]) -> mb$inner # left outer join microbenchmark (df1, df2, by = c("x"="x")), DT = dt2[dt1, on = "x"]) -> mb$left # right outer join microbenchmark right_join(df1, df2, by = "x"), DT = dt1[dt2, on = "x"]) -> mb$right # full outer join microbenchmark
在计算时间方面,运用microbenchmark包,生成每次运行的时间,最后计算中位数,代码与结果如下: library(microbenchmark) growthRBL <- function(x) library(microbenchmark) growthRBV <- function(x) { shift <- function(y) { c(NA, y[1:(length (y)-1)]) } x/shift(x) - 1 } time2 <- microbenchmark(growthRBV(1:10000), times = 1000) %>% as.data.table library(microbenchmark) growthRDV <- function(x) { x/data.table::shift(x) - 1 } time3 <- microbenchmark (若有对Rcpp感兴趣的同学可以戳这里进行了解) library(microbenchmark) Rcpp::cppFunction('NumericVector growthRCL(NumericVector
性能测试 我们先通过基准测试来比对两种方法的计算效率: # 生成一组随机数 x <- rnorm(1e6) # 测试 microbenchmark::microbenchmark( mean = mean microbenchmark::microbenchmark( mean = .Internal(mean(x)), comb = sum(x) / length(x) ) #> Unit: microseconds microbenchmark::microbenchmark( mean = mean(x), mean_internal = .Internal(mean(x)), comb = sum(
df.csv 179.46119 ## df.feather 185.96806 ## df.RData 29.93043 ## df.rds 29.93044 评估速度 采用microbenchmark 基于一台破笔记本的速度评估 library(microbenchmark) benchmark <- microbenchmark(readCSV = utils::read.csv(path_csv) readFeather 673.4313 739.8717 894.3114 871.7041 934.1121 1351.928 10 基于一台SSD硬盘的工作站速度评估 library(microbenchmark ) benchmark2 <- microbenchmark(readCSV = utils::read.csv(path_csv), readrCSV = readr::
id = seq_len(n), date = seq(as.Date("0001-01-01"), len = n, by = "day") %>% as.character) 测试方法 我们使用“microbenchmark 测试结果 microbenchmark(dt[, .(id, date = as.Date(date))], times = 5) # 0.93 s microbenchmark(dt[, . (id, date = as.IDate(date))], times = 5) # 0.93 s microbenchmark(dt[, . (id, date = ymd(date))], times = 5) # 0.018 s microbenchmark(dt[, .
@BenchmarkMode({Mode.Throughput}) @State(Scope.Benchmark) public class MicroBenchmark { private String[] args) throws RunnerException { Options opt = new OptionsBuilder() .include(MicroBenchmark.class.getSimpleName (opt).run(); } } 吞吐量报告: Benchmark Mode Cnt Score Error Units MicroBenchmark.fastjson thrpt 25 6724809.416 ± 1542197.448 ops/s MicroBenchmark.gson thrpt 25 1508825.440 ± 194148.657 ops/s MicroBenchmark.hessian2 thrpt 25 758643.567 ± 239754.709 ops/s MicroBenchmark.java
@BenchmarkMode({Mode.Throughput}) @State(Scope.Benchmark) public class MicroBenchmark { private String[] args) throws RunnerException { Options opt = new OptionsBuilder() .include(MicroBenchmark.class.getSimpleName Runner(opt).run(); } } 吞吐量报告: Benchmark Mode Cnt Score Error Units MicroBenchmark.fastjson thrpt 25 6724809.416 ± 1542197.448 ops/s MicroBenchmark.gson thrpt 25 1508825.440 ± 194148.657 ops/s MicroBenchmark.hessian2 thrpt 25 758643.567 ± 239754.709 ops/s MicroBenchmark.java
这些是一些表现的结果: library(microbenchmark) t <- 1000/lambda tm <- microbenchmark(option.1(t),option.2(t),option
230: Microbenchmark Suite:新增一套微基准测试,使开发者能够基于现有的 Java Microbenchmark Harness(JMH)轻松测试 JDK 的性能,并创建新的基准测试
function(df) { df |> arrange(desc(val))|> distinct(g, .keep_all = TRUE) } 使用专门的测试包进行测试: rv <- microbenchmark ::microbenchmark( solu1 = solution1(data), solu2 = solution2(data), times = 100 ) plot(rv) 可以看的出来
suppressPackageStartupMessages(library(tidyverse)) microbenchmark::microbenchmark( case_when(1:1000
((365:(365-n+1))/365) } x } f3 <- function(){ ny <- 365 x <- 1 - cumprod((ny:1)/ny) x } microbenchmark ::microbenchmark( f1(), f2(), f3() ) ## Unit: microseconds ## expr min lq mean
Garbage Collector (Experimental)(http://openjdk.java.net/jeps/189):新增名为 Shenandoah 的、低暂停时间的实验性垃圾收集器; 230:Microbenchmark Suite(http://openjdk.java.net/jeps/230):新增微基准测试套件(Microbenchmark Suite),使开发人员可以轻松运行现有的微基准测试并创建新的基准测试
需要用到的包:microbenchmark, ggplot2movies, profvis, Rcpp 代码分析 首先是确定哪个是瓶颈,Rprof()是可以分析的一个内置工具,但是这个结果不确定,取决于外部环境 Rcpp) cppFunction( double add_cpp(double x, double y){ double value = x * y; return value }) z <- microbenchmark
((365:(365-n+1))/365) } x } f3 <- function(){ ny <- 365 x <- 1 - cumprod((ny:1)/ny) x } microbenchmark ::microbenchmark( f1(), f2(), f3() ) ## Unit: microseconds ## expr min lq mean 0.10 0.0 0.00 "ddply" 57.1 0.08 0.0 0.00 "ldply" 其他的命令运行检查工具microbenchmark ) } # 循环计算 f2 <- function(x) mean( abs(x - median(x)) ) # 向量化计算 x <- runif(10000) # 获得随机数,类似rnrom microbenchmark ::microbenchmark( f1(x), f2(x) ) ## Unit: microseconds ## expr min lq mean median
下载测试 library(microbenchmark) 先编写一个下载函数: download_test <- function(x, use_hiplot = FALSE) { if (use_hiplot XenaDownload(force = TRUE) } 我们下载看一看,下载重复 5 次,看下平均水平: options(use_hiplot = TRUE) download_stats <- microbenchmark
简单的模型测试 对于性能测试,我们可以使用 Java Microbenchmark Harness,关于如何使用它的更多信息可以在 这篇文章:https://www.baeldung.com/java-microbenchmark-harness 真实模型测试 对于性能测试,我们可以使用 Java Microbenchmark Harness,关于如何使用它的更多信息可以在 这篇文章:https://www.baeldung.com/java-microbenchmark-harness