BenchMark介绍

最近大佬叫我做下Benchmark,之前一直没接触过,顺便学习一波。

BenchMark 又叫做基准测试,主要用来测试一些方法的性能,可以根据不同的参数以不同的单位进行计算(例如可以使用吞吐量为单位,也可以使用平均时间作为单位,在 BenchmarkMode 里面进行调整)。

开始前的步骤

项目使用的是 Maven,因此只要对 pom.xml 添加依赖即可。

<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.19</version>
<scope>provided</scope>
</dependency>

例子

记得之前和宿友讨论 ArrayList 和 LinkedList 的遍历的性能差别,当时以一种不太妥当的方法进行测试,导致无法得到比较好的结果,刚好这里可以使用这两个来进行比较。

代码

package com.psd.benchmark;

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder; import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit; /**
* Author: Shadowdsp
* Date: 18/07/22
*/ @BenchmarkMode(Mode.Throughput) // 吞吐量
@OutputTimeUnit(TimeUnit.MILLISECONDS) // 结果所使用的时间单位
@State(Scope.Thread) // 每个测试线程分配一个实例
@Fork(2) // Fork进行的数目
@Warmup(iterations = 4) // 先预热4轮
@Measurement(iterations = 10) // 进行10轮测试
public class BenchMark { @Param({"10", "40", "70", "100"}) // 定义四个参数,之后会分别对这四个参数进行测试
private int n; private List<Integer> array;
private List<Integer> list; @Setup(Level.Trial) // 初始化方法,在全部Benchmark运行之前进行
public void init() {
array = new ArrayList<>(0);
list = new LinkedList<>();
for (int i = 0; i < n; i++) {
array.add(i);
list.add(i);
}
} @Benchmark
public void arrayTraverse() {
for (int i = 0; i < n; i++) {
array.get(i);
}
} @Benchmark
public void listTraverse() {
for (int i = 0; i < n; i++) {
list.get(i);
}
} @TearDown(Level.Trial) // 结束方法,在全部Benchmark运行之后进行
public void arrayRemove() {
for (int i = 0; i < n; i++) {
array.remove(0);
list.remove(0);
}
} public static void main(String[] args) throws RunnerException {
Options options = new OptionsBuilder().include(BenchMark.class.getSimpleName()).build();
new Runner(options).run();
}
}

报告

E:\Java\JDK8\bin\java "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\lib\idea_rt.jar=6182:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\Java\JDK8\jre\lib\charsets.jar;E:\Java\JDK8\jre\lib\deploy.jar;E:\Java\JDK8\jre\lib\ext\access-bridge-64.jar;E:\Java\JDK8\jre\lib\ext\cldrdata.jar;E:\Java\JDK8\jre\lib\ext\dnsns.jar;E:\Java\JDK8\jre\lib\ext\jaccess.jar;E:\Java\JDK8\jre\lib\ext\jfxrt.jar;E:\Java\JDK8\jre\lib\ext\localedata.jar;E:\Java\JDK8\jre\lib\ext\nashorn.jar;E:\Java\JDK8\jre\lib\ext\sunec.jar;E:\Java\JDK8\jre\lib\ext\sunjce_provider.jar;E:\Java\JDK8\jre\lib\ext\sunmscapi.jar;E:\Java\JDK8\jre\lib\ext\sunpkcs11.jar;E:\Java\JDK8\jre\lib\ext\zipfs.jar;E:\Java\JDK8\jre\lib\javaws.jar;E:\Java\JDK8\jre\lib\jce.jar;E:\Java\JDK8\jre\lib\jfr.jar;E:\Java\JDK8\jre\lib\jfxswt.jar;E:\Java\JDK8\jre\lib\jsse.jar;E:\Java\JDK8\jre\lib\management-agent.jar;E:\Java\JDK8\jre\lib\plugin.jar;E:\Java\JDK8\jre\lib\resources.jar;E:\Java\JDK8\jre\lib\rt.jar;E:\Java\IdeaProjects\Warehouse\target\classes;E:\Java\maven\LocalWarehouse\junit\junit\4.11\junit-4.11.jar;E:\Java\maven\LocalWarehouse\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;E:\Java\maven\LocalWarehouse\org\springframework\spring-core\4.0.2.RELEASE\spring-core-4.0.2.RELEASE.jar;E:\Java\maven\LocalWarehouse\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;E:\Java\maven\LocalWarehouse\org\springframework\spring-web\4.0.2.RELEASE\spring-web-4.0.2.RELEASE.jar;E:\Java\maven\LocalWarehouse\org\springframework\spring-beans\4.0.2.RELEASE\spring-beans-4.0.2.RELEASE.jar;E:\Java\maven\LocalWarehouse\org\springframework\spring-context\4.0.2.RELEASE\spring-context-4.0.2.RELEASE.jar;E:\Java\maven\LocalWarehouse\org\springframework\spring-oxm\4.0.2.RELEASE\spring-oxm-4.0.2.RELEASE.jar;E:\Java\maven\LocalWarehouse\org\springframework\spring-tx\4.0.2.RELEASE\spring-tx-4.0.2.RELEASE.jar;E:\Java\maven\LocalWarehouse\org\springframework\spring-jdbc\4.0.2.RELEASE\spring-jdbc-4.0.2.RELEASE.jar;E:\Java\maven\LocalWarehouse\org\springframework\spring-webmvc\4.0.2.RELEASE\spring-webmvc-4.0.2.RELEASE.jar;E:\Java\maven\LocalWarehouse\org\springframework\spring-expression\4.0.2.RELEASE\spring-expression-4.0.2.RELEASE.jar;E:\Java\maven\LocalWarehouse\org\springframework\spring-aop\4.0.2.RELEASE\spring-aop-4.0.2.RELEASE.jar;E:\Java\maven\LocalWarehouse\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;E:\Java\maven\LocalWarehouse\org\springframework\spring-context-support\4.0.2.RELEASE\spring-context-support-4.0.2.RELEASE.jar;E:\Java\maven\LocalWarehouse\org\springframework\spring-test\4.0.2.RELEASE\spring-test-4.0.2.RELEASE.jar;E:\Java\maven\LocalWarehouse\org\mybatis\mybatis\3.2.6\mybatis-3.2.6.jar;E:\Java\maven\LocalWarehouse\org\mybatis\mybatis-spring\1.2.2\mybatis-spring-1.2.2.jar;E:\Java\maven\LocalWarehouse\javax\javaee-api\7.0\javaee-api-7.0.jar;E:\Java\maven\LocalWarehouse\com\sun\mail\javax.mail\1.5.0\javax.mail-1.5.0.jar;E:\Java\maven\LocalWarehouse\javax\activation\activation\1.1\activation-1.1.jar;E:\Java\maven\LocalWarehouse\mysql\mysql-connector-java\5.1.30\mysql-connector-java-5.1.30.jar;E:\Java\maven\LocalWarehouse\commons-dbcp\commons-dbcp\1.2.2\commons-dbcp-1.2.2.jar;E:\Java\maven\LocalWarehouse\commons-pool\commons-pool\1.3\commons-pool-1.3.jar;E:\Java\maven\LocalWarehouse\jstl\jstl\1.2\jstl-1.2.jar;E:\Java\maven\LocalWarehouse\log4j\log4j\1.2.17\log4j-1.2.17.jar;E:\Java\maven\LocalWarehouse\com\alibaba\fastjson\1.1.41\fastjson-1.1.41.jar;E:\Java\maven\LocalWarehouse\org\slf4j\slf4j-api\1.7.7\slf4j-api-1.7.7.jar;E:\Java\maven\LocalWarehouse\org\slf4j\slf4j-log4j12\1.7.7\slf4j-log4j12-1.7.7.jar;E:\Java\maven\LocalWarehouse\org\codehaus\jackson\jackson-mapper-asl\1.9.13\jackson-mapper-asl-1.9.13.jar;E:\Java\maven\LocalWarehouse\org\codehaus\jackson\jackson-core-asl\1.9.13\jackson-core-asl-1.9.13.jar;E:\Java\maven\LocalWarehouse\commons-fileupload\commons-fileupload\1.3.1\commons-fileupload-1.3.1.jar;E:\Java\maven\LocalWarehouse\commons-io\commons-io\2.4\commons-io-2.4.jar;E:\Java\maven\LocalWarehouse\commons-codec\commons-codec\1.9\commons-codec-1.9.jar;E:\Java\maven\LocalWarehouse\org\junit\jupiter\junit-jupiter-api\5.3.0-M1\junit-jupiter-api-5.3.0-M1.jar;E:\Java\maven\LocalWarehouse\org\apiguardian\apiguardian-api\1.0.0\apiguardian-api-1.0.0.jar;E:\Java\maven\LocalWarehouse\org\opentest4j\opentest4j\1.1.0\opentest4j-1.1.0.jar;E:\Java\maven\LocalWarehouse\org\junit\platform\junit-platform-commons\1.3.0-M1\junit-platform-commons-1.3.0-M1.jar;E:\Java\maven\LocalWarehouse\org\openjdk\jmh\jmh-core\1.19\jmh-core-1.19.jar;E:\Java\maven\LocalWarehouse\net\sf\jopt-simple\jopt-simple\4.6\jopt-simple-4.6.jar;E:\Java\maven\LocalWarehouse\org\apache\commons\commons-math3\3.2\commons-math3-3.2.jar com.psd.benchmark.BenchMark
# JMH version: 1.19
# VM version: JDK 1.8.0_144, VM 25.144-b01
# VM invoker: E:\Java\JDK8\jre\bin\java.exe
# VM options: -javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\lib\idea_rt.jar=6182:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\bin -Dfile.encoding=UTF-8
# Warmup: 4 iterations, 1 s each
# Measurement: 10 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.psd.benchmark.BenchMark.arrayTraverse
# Parameters: (n = 10) # Run progress: 0.00% complete, ETA 00:03:44
# Fork: 1 of 2
# Warmup Iteration 1: 189538.902 ops/ms
# Warmup Iteration 2: 287165.702 ops/ms
# Warmup Iteration 3: 282388.510 ops/ms
# Warmup Iteration 4: 277296.753 ops/ms
Iteration 1: 288687.174 ops/ms
Iteration 2: 277046.541 ops/ms
Iteration 3: 288680.458 ops/ms
Iteration 4: 279775.705 ops/ms
Iteration 5: 289098.257 ops/ms
Iteration 6: 287462.515 ops/ms
Iteration 7: 255330.788 ops/ms
Iteration 8: 282631.894 ops/ms
Iteration 9: 277038.372 ops/ms
Iteration 10: 277690.784 ops/ms # Run progress: 6.25% complete, ETA 00:03:42
# Fork: 2 of 2
# Warmup Iteration 1: 286568.900 ops/ms
# Warmup Iteration 2: 288014.591 ops/ms
# Warmup Iteration 3: 281790.934 ops/ms
# Warmup Iteration 4: 279647.288 ops/ms
Iteration 1: 280839.175 ops/ms
Iteration 2: 289208.462 ops/ms
Iteration 3: 282724.949 ops/ms
Iteration 4: 289762.265 ops/ms
Iteration 5: 284551.820 ops/ms
Iteration 6: 283700.745 ops/ms
Iteration 7: 261083.800 ops/ms
Iteration 8: 283651.988 ops/ms
Iteration 9: 284418.725 ops/ms
Iteration 10: 282418.733 ops/ms Result "com.psd.benchmark.BenchMark.arrayTraverse":
281290.158 ±(99.9%) 7750.303 ops/ms [Average]
(min, avg, max) = (255330.788, 281290.158, 289762.265), stdev = 8925.261
CI (99.9%): [273539.854, 289040.461] (assumes normal distribution) # JMH version: 1.19
# VM version: JDK 1.8.0_144, VM 25.144-b01
# VM invoker: E:\Java\JDK8\jre\bin\java.exe
# VM options: -javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\lib\idea_rt.jar=6182:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\bin -Dfile.encoding=UTF-8
# Warmup: 4 iterations, 1 s each
# Measurement: 10 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.psd.benchmark.BenchMark.arrayTraverse
# Parameters: (n = 40) # Run progress: 12.50% complete, ETA 00:03:27
# Fork: 1 of 2
# Warmup Iteration 1: 277185.994 ops/ms
# Warmup Iteration 2: 277343.966 ops/ms
# Warmup Iteration 3: 289105.366 ops/ms
# Warmup Iteration 4: 281931.930 ops/ms
Iteration 1: 279532.380 ops/ms
Iteration 2: 278419.091 ops/ms
Iteration 3: 281165.591 ops/ms
Iteration 4: 288999.045 ops/ms
Iteration 5: 277378.462 ops/ms
Iteration 6: 275360.726 ops/ms
Iteration 7: 282858.013 ops/ms
Iteration 8: 283601.524 ops/ms
Iteration 9: 279043.295 ops/ms
Iteration 10: 279976.466 ops/ms # Run progress: 18.75% complete, ETA 00:03:12
# Fork: 2 of 2
# Warmup Iteration 1: 284211.718 ops/ms
# Warmup Iteration 2: 287327.346 ops/ms
# Warmup Iteration 3: 268548.012 ops/ms
# Warmup Iteration 4: 289429.098 ops/ms
Iteration 1: 283348.446 ops/ms
Iteration 2: 262579.782 ops/ms
Iteration 3: 283534.897 ops/ms
Iteration 4: 266160.111 ops/ms
Iteration 5: 289614.776 ops/ms
Iteration 6: 274270.699 ops/ms
Iteration 7: 267829.186 ops/ms
Iteration 8: 279612.742 ops/ms
Iteration 9: 283569.117 ops/ms
Iteration 10: 288172.441 ops/ms Result "com.psd.benchmark.BenchMark.arrayTraverse":
279251.339 ±(99.9%) 6287.385 ops/ms [Average]
(min, avg, max) = (262579.782, 279251.339, 289614.776), stdev = 7240.561
CI (99.9%): [272963.955, 285538.724] (assumes normal distribution) # JMH version: 1.19
# VM version: JDK 1.8.0_144, VM 25.144-b01
# VM invoker: E:\Java\JDK8\jre\bin\java.exe
# VM options: -javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\lib\idea_rt.jar=6182:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\bin -Dfile.encoding=UTF-8
# Warmup: 4 iterations, 1 s each
# Measurement: 10 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.psd.benchmark.BenchMark.arrayTraverse
# Parameters: (n = 70) # Run progress: 25.00% complete, ETA 00:02:57
# Fork: 1 of 2
# Warmup Iteration 1: 276172.253 ops/ms
# Warmup Iteration 2: 284624.007 ops/ms
# Warmup Iteration 3: 288356.101 ops/ms
# Warmup Iteration 4: 284278.064 ops/ms
Iteration 1: 287831.035 ops/ms
Iteration 2: 286518.388 ops/ms
Iteration 3: 287016.992 ops/ms
Iteration 4: 282654.336 ops/ms
Iteration 5: 287899.254 ops/ms
Iteration 6: 287299.594 ops/ms
Iteration 7: 284624.713 ops/ms
Iteration 8: 287280.777 ops/ms
Iteration 9: 268079.560 ops/ms
Iteration 10: 266327.469 ops/ms # Run progress: 31.25% complete, ETA 00:02:42
# Fork: 2 of 2
# Warmup Iteration 1: 282831.765 ops/ms
# Warmup Iteration 2: 271396.073 ops/ms
# Warmup Iteration 3: 280114.449 ops/ms
# Warmup Iteration 4: 272365.705 ops/ms
Iteration 1: 287276.286 ops/ms
Iteration 2: 258473.510 ops/ms
Iteration 3: 287822.759 ops/ms
Iteration 4: 281849.137 ops/ms
Iteration 5: 281739.415 ops/ms
Iteration 6: 271390.808 ops/ms
Iteration 7: 279252.964 ops/ms
Iteration 8: 280445.016 ops/ms
Iteration 9: 287019.516 ops/ms
Iteration 10: 283679.804 ops/ms Result "com.psd.benchmark.BenchMark.arrayTraverse":
281224.067 ±(99.9%) 7376.077 ops/ms [Average]
(min, avg, max) = (258473.510, 281224.067, 287899.254), stdev = 8494.301
CI (99.9%): [273847.990, 288600.143] (assumes normal distribution) # JMH version: 1.19
# VM version: JDK 1.8.0_144, VM 25.144-b01
# VM invoker: E:\Java\JDK8\jre\bin\java.exe
# VM options: -javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\lib\idea_rt.jar=6182:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\bin -Dfile.encoding=UTF-8
# Warmup: 4 iterations, 1 s each
# Measurement: 10 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.psd.benchmark.BenchMark.arrayTraverse
# Parameters: (n = 100) # Run progress: 37.50% complete, ETA 00:02:27
# Fork: 1 of 2
# Warmup Iteration 1: 277758.992 ops/ms
# Warmup Iteration 2: 283193.840 ops/ms
# Warmup Iteration 3: 280441.005 ops/ms
# Warmup Iteration 4: 284059.500 ops/ms
Iteration 1: 288156.207 ops/ms
Iteration 2: 277402.478 ops/ms
Iteration 3: 274760.100 ops/ms
Iteration 4: 280052.747 ops/ms
Iteration 5: 261148.816 ops/ms
Iteration 6: 281093.340 ops/ms
Iteration 7: 278472.671 ops/ms
Iteration 8: 257387.342 ops/ms
Iteration 9: 258938.869 ops/ms
Iteration 10: 281241.529 ops/ms # Run progress: 43.75% complete, ETA 00:02:12
# Fork: 2 of 2
# Warmup Iteration 1: 261991.159 ops/ms
# Warmup Iteration 2: 272490.286 ops/ms
# Warmup Iteration 3: 283308.053 ops/ms
# Warmup Iteration 4: 262856.702 ops/ms
Iteration 1: 283588.427 ops/ms
Iteration 2: 289665.875 ops/ms
Iteration 3: 242227.467 ops/ms
Iteration 4: 235915.418 ops/ms
Iteration 5: 282235.546 ops/ms
Iteration 6: 262060.151 ops/ms
Iteration 7: 249476.606 ops/ms
Iteration 8: 289452.132 ops/ms
Iteration 9: 249939.347 ops/ms
Iteration 10: 268307.387 ops/ms Result "com.psd.benchmark.BenchMark.arrayTraverse":
269576.123 ±(99.9%) 14237.446 ops/ms [Average]
(min, avg, max) = (235915.418, 269576.123, 289665.875), stdev = 16395.864
CI (99.9%): [255338.677, 283813.569] (assumes normal distribution) # JMH version: 1.19
# VM version: JDK 1.8.0_144, VM 25.144-b01
# VM invoker: E:\Java\JDK8\jre\bin\java.exe
# VM options: -javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\lib\idea_rt.jar=6182:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\bin -Dfile.encoding=UTF-8
# Warmup: 4 iterations, 1 s each
# Measurement: 10 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.psd.benchmark.BenchMark.listTraverse
# Parameters: (n = 10) # Run progress: 50.00% complete, ETA 00:01:58
# Fork: 1 of 2
# Warmup Iteration 1: 44140.774 ops/ms
# Warmup Iteration 2: 32207.674 ops/ms
# Warmup Iteration 3: 36260.862 ops/ms
# Warmup Iteration 4: 32678.534 ops/ms
Iteration 1: 35846.579 ops/ms
Iteration 2: 34837.967 ops/ms
Iteration 3: 36439.906 ops/ms
Iteration 4: 36522.320 ops/ms
Iteration 5: 35112.493 ops/ms
Iteration 6: 35687.937 ops/ms
Iteration 7: 35727.530 ops/ms
Iteration 8: 31676.889 ops/ms
Iteration 9: 36219.853 ops/ms
Iteration 10: 35857.764 ops/ms # Run progress: 56.25% complete, ETA 00:01:43
# Fork: 2 of 2
# Warmup Iteration 1: 34479.354 ops/ms
# Warmup Iteration 2: 34805.614 ops/ms
# Warmup Iteration 3: 37839.045 ops/ms
# Warmup Iteration 4: 38778.482 ops/ms
Iteration 1: 37184.558 ops/ms
Iteration 2: 35340.593 ops/ms
Iteration 3: 37976.310 ops/ms
Iteration 4: 39359.895 ops/ms
Iteration 5: 37142.984 ops/ms
Iteration 6: 38973.376 ops/ms
Iteration 7: 38609.058 ops/ms
Iteration 8: 39516.419 ops/ms
Iteration 9: 33589.403 ops/ms
Iteration 10: 37153.584 ops/ms Result "com.psd.benchmark.BenchMark.listTraverse":
36438.771 ±(99.9%) 1680.987 ops/ms [Average]
(min, avg, max) = (31676.889, 36438.771, 39516.419), stdev = 1935.828
CI (99.9%): [34757.784, 38119.758] (assumes normal distribution) # JMH version: 1.19
# VM version: JDK 1.8.0_144, VM 25.144-b01
# VM invoker: E:\Java\JDK8\jre\bin\java.exe
# VM options: -javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\lib\idea_rt.jar=6182:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\bin -Dfile.encoding=UTF-8
# Warmup: 4 iterations, 1 s each
# Measurement: 10 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.psd.benchmark.BenchMark.listTraverse
# Parameters: (n = 40) # Run progress: 62.50% complete, ETA 00:01:28
# Fork: 1 of 2
# Warmup Iteration 1: 6381.367 ops/ms
# Warmup Iteration 2: 6267.589 ops/ms
# Warmup Iteration 3: 6070.546 ops/ms
# Warmup Iteration 4: 6311.543 ops/ms
Iteration 1: 6294.215 ops/ms
Iteration 2: 6221.013 ops/ms
Iteration 3: 6196.371 ops/ms
Iteration 4: 5960.573 ops/ms
Iteration 5: 5748.201 ops/ms
Iteration 6: 5494.775 ops/ms
Iteration 7: 5594.778 ops/ms
Iteration 8: 6345.496 ops/ms
Iteration 9: 6141.148 ops/ms
Iteration 10: 6017.750 ops/ms # Run progress: 68.75% complete, ETA 00:01:13
# Fork: 2 of 2
# Warmup Iteration 1: 6369.814 ops/ms
# Warmup Iteration 2: 6258.675 ops/ms
# Warmup Iteration 3: 5802.971 ops/ms
# Warmup Iteration 4: 6028.703 ops/ms
Iteration 1: 6192.258 ops/ms
Iteration 2: 5966.093 ops/ms
Iteration 3: 5958.597 ops/ms
Iteration 4: 6171.185 ops/ms
Iteration 5: 5617.002 ops/ms
Iteration 6: 5387.913 ops/ms
Iteration 7: 5299.407 ops/ms
Iteration 8: 5939.628 ops/ms
Iteration 9: 5640.087 ops/ms
Iteration 10: 6057.939 ops/ms Result "com.psd.benchmark.BenchMark.listTraverse":
5912.221 ±(99.9%) 271.819 ops/ms [Average]
(min, avg, max) = (5299.407, 5912.221, 6345.496), stdev = 313.027
CI (99.9%): [5640.403, 6184.040] (assumes normal distribution) # JMH version: 1.19
# VM version: JDK 1.8.0_144, VM 25.144-b01
# VM invoker: E:\Java\JDK8\jre\bin\java.exe
# VM options: -javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\lib\idea_rt.jar=6182:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\bin -Dfile.encoding=UTF-8
# Warmup: 4 iterations, 1 s each
# Measurement: 10 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.psd.benchmark.BenchMark.listTraverse
# Parameters: (n = 70) # Run progress: 75.00% complete, ETA 00:00:59
# Fork: 1 of 2
# Warmup Iteration 1: 1904.675 ops/ms
# Warmup Iteration 2: 1829.190 ops/ms
# Warmup Iteration 3: 1799.166 ops/ms
# Warmup Iteration 4: 1823.508 ops/ms
Iteration 1: 1483.423 ops/ms
Iteration 2: 1733.061 ops/ms
Iteration 3: 1752.878 ops/ms
Iteration 4: 1877.448 ops/ms
Iteration 5: 1748.907 ops/ms
Iteration 6: 1836.011 ops/ms
Iteration 7: 1830.008 ops/ms
Iteration 8: 1733.991 ops/ms
Iteration 9: 1821.246 ops/ms
Iteration 10: 1827.086 ops/ms # Run progress: 81.25% complete, ETA 00:00:44
# Fork: 2 of 2
# Warmup Iteration 1: 1858.409 ops/ms
# Warmup Iteration 2: 1816.699 ops/ms
# Warmup Iteration 3: 1810.298 ops/ms
# Warmup Iteration 4: 1704.668 ops/ms
Iteration 1: 1772.384 ops/ms
Iteration 2: 1619.981 ops/ms
Iteration 3: 1754.014 ops/ms
Iteration 4: 1767.706 ops/ms
Iteration 5: 1706.000 ops/ms
Iteration 6: 1646.038 ops/ms
Iteration 7: 1789.584 ops/ms
Iteration 8: 1746.964 ops/ms
Iteration 9: 1785.779 ops/ms
Iteration 10: 1813.610 ops/ms Result "com.psd.benchmark.BenchMark.listTraverse":
1752.306 ±(99.9%) 77.143 ops/ms [Average]
(min, avg, max) = (1483.423, 1752.306, 1877.448), stdev = 88.838
CI (99.9%): [1675.163, 1829.449] (assumes normal distribution) # JMH version: 1.19
# VM version: JDK 1.8.0_144, VM 25.144-b01
# VM invoker: E:\Java\JDK8\jre\bin\java.exe
# VM options: -javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\lib\idea_rt.jar=6182:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\bin -Dfile.encoding=UTF-8
# Warmup: 4 iterations, 1 s each
# Measurement: 10 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.psd.benchmark.BenchMark.listTraverse
# Parameters: (n = 100) # Run progress: 87.50% complete, ETA 00:00:29
# Fork: 1 of 2
# Warmup Iteration 1: 784.637 ops/ms
# Warmup Iteration 2: 803.586 ops/ms
# Warmup Iteration 3: 780.992 ops/ms
# Warmup Iteration 4: 812.284 ops/ms
Iteration 1: 771.280 ops/ms
Iteration 2: 725.038 ops/ms
Iteration 3: 781.465 ops/ms
Iteration 4: 753.939 ops/ms
Iteration 5: 753.920 ops/ms
Iteration 6: 813.238 ops/ms
Iteration 7: 778.423 ops/ms
Iteration 8: 809.902 ops/ms
Iteration 9: 769.837 ops/ms
Iteration 10: 767.709 ops/ms # Run progress: 93.75% complete, ETA 00:00:14
# Fork: 2 of 2
# Warmup Iteration 1: 703.812 ops/ms
# Warmup Iteration 2: 752.538 ops/ms
# Warmup Iteration 3: 774.776 ops/ms
# Warmup Iteration 4: 813.269 ops/ms
Iteration 1: 796.985 ops/ms
Iteration 2: 687.697 ops/ms
Iteration 3: 808.395 ops/ms
Iteration 4: 736.341 ops/ms
Iteration 5: 761.328 ops/ms
Iteration 6: 746.422 ops/ms
Iteration 7: 767.855 ops/ms
Iteration 8: 814.670 ops/ms
Iteration 9: 772.441 ops/ms
Iteration 10: 731.986 ops/ms Result "com.psd.benchmark.BenchMark.listTraverse":
767.444 ±(99.9%) 28.363 ops/ms [Average]
(min, avg, max) = (687.697, 767.444, 814.670), stdev = 32.662
CI (99.9%): [739.081, 795.806] (assumes normal distribution) # Run complete. Total time: 00:03:56
(一般只需要关注这下面的东西) Benchmark (n) Mode Cnt Score Error Units
BenchMark.arrayTraverse 10 thrpt 20 281290.158 ± 7750.303 ops/ms
BenchMark.arrayTraverse 40 thrpt 20 279251.339 ± 6287.385 ops/ms
BenchMark.arrayTraverse 70 thrpt 20 281224.067 ± 7376.077 ops/ms
BenchMark.arrayTraverse 100 thrpt 20 269576.123 ± 14237.446 ops/ms
BenchMark.listTraverse 10 thrpt 20 36438.771 ± 1680.987 ops/ms
BenchMark.listTraverse 40 thrpt 20 5912.221 ± 271.819 ops/ms
BenchMark.listTraverse 70 thrpt 20 1752.306 ± 77.143 ops/ms
BenchMark.listTraverse 100 thrpt 20 767.444 ± 28.363 ops/ms Process finished with exit code 0

报告很长,因为这里的n有四种情况,然后有两个 @Benchmark 方法,因此会进行8次测试。

大多数情况只需要关注最下面的结果。

可以结合 Score 和 Unit 这两列,看到方法的效率。这里显然 arrayTraverse 的效率比 listTraverse 的高很多,因为 Unit 单位是 ops/ms,即单位时间内执行的操作数。所以显然在遍历的时候,ArrayList的效率是比LinkedList高的。

注解介绍

@BenchmarkMode

Mode 表示 JMH 进行 Benchmark 时所使用的模式。通常是测量的维度不同,或是测量的方式不同。目前 JMH 共有四种模式:

  1. Throughput: 整体吞吐量,例如“1秒内可以执行多少次调用”,单位是操作数/时间。
  2. AverageTime: 调用的平均时间,例如“每次调用平均耗时xxx毫秒”,单位是时间/操作数。
  3. SampleTime: 随机取样,最后输出取样结果的分布,例如“99%的调用在xxx毫秒以内,99.99%的调用在xxx毫秒以内”
  4. SingleShotTime: 以上模式都是默认一次 iteration 是 1s,唯有 SingleShotTime 是只运行一次。往往同时把 warmup 次数设为0,用于测试冷启动时的性能。

@OutputTimeUnit

输出的时间单位。

@Iteration

Iteration 是 JMH 进行测试的最小单位。在大部分模式下,一次 iteration 代表的是一秒,JMH 会在这一秒内不断调用需要 Benchmark 的方法,然后根据模式对其采样,计算吞吐量,计算平均执行时间等。

@WarmUp

Warmup 是指在实际进行 Benchmark 前先进行预热的行为。

为什么需要预热?因为 JVM 的 JIT 机制的存在,如果某个函数被调用多次之后,JVM 会尝试将其编译成为机器码从而提高执行速度。为了让 Benchmark 的结果更加接近真实情况就需要进行预热。

@State

类注解,JMH测试类必须使用 @State 注解,它定义了一个类实例的生命周期,可以类比 Spring Bean 的 Scope。由于 JMH 允许多线程同时执行测试,不同的选项含义如下:

  1. Scope.Thread:默认的 State,每个测试线程分配一个实例;
  2. Scope.Benchmark:所有测试线程共享一个实例,用于测试有状态实例在多线程共享下的性能;
  3. Scope.Group:每个线程组共享一个实例;

@Fork

进行 fork 的次数。如果 fork 数是2的话,则 JMH 会 fork 出两个进程来进行测试。

@Meansurement

提供真正的测试阶段参数。指定迭代的次数,每次迭代的运行时间和每次迭代测试调用的数量(通常使用 @BenchmarkMode(Mode.SingleShotTime) 测试一组操作的开销——而不使用循环)

@Setup

方法注解,会在执行 benchmark 之前被执行,正如其名,主要用于初始化。

@TearDown

方法注解,与@Setup 相对的,会在所有 benchmark 执行结束以后执行,主要用于资源的回收等。

@Setup/@TearDown注解使用Level参数来指定何时调用fixture:

名称 描述
Level.Trial 默认level。全部benchmark运行(一组迭代)之前/之后
Level.Iteration 一次迭代之前/之后(一组调用)
Level.Invocation 每个方法调用之前/之后(不推荐使用,除非你清楚这样做的目的)

@Benchmark

方法注解,表示该方法是需要进行 benchmark 的对象。

@Param

成员注解,可以用来指定某项参数的多种情况。特别适合用来测试一个函数在不同的参数输入的情况下的性能。@Param 注解接收一个String数组,在 @Setup 方法执行前转化为为对应的数据类型。多个 @Param 注解的成员之间是乘积关系,譬如有两个用 @Param 注解的字段,第一个有5个值,第二个字段有2个值,那么每个测试方法会跑5*2=10次。

使用JMH做Benchmark基准测试的更多相关文章

  1. [译]使用JMH进行微基准测试:不要猜,要测试!

    英文原文:Micro Benchmarking with JMH: Measure, don't guess!翻译地址:使用JMH进行微基准测试:不要猜,要测试!原文作者:Antonio翻译作者:Ho ...

  2. mysql benchmark基准测试

    git项目地址: https://github.com/akopytov/sysbench 利用sysbench很容易对mysql做性能基准测试(当然这个工具很强大,除了测试主流数据库性能,还能测试其 ...

  3. 基于JMH的Benchmark解决方案

    原始Benchmark做法 在设计新框架的时候,往往需要评估待接入的组件的性能,这个时候我们可能会利用UnitTest来进行,写一个方法,然后在循环里面跑,利用System.CurrentTimeMi ...

  4. 探究Go-YCSB做数据库基准测试

    本篇文章开篇会介绍一下Go-YCSB是如何使用,然后按照惯例会分析一下它是如何做基准测试,看看它有什么优缺点. 转载请声明出处哦~,本篇文章发布于luozhiyun的博客: https://www.l ...

  5. PHP Framework MVC Benchmark 基准测试

    身边有朋友在用yaf框架,讨论的也声音也比较多,今天没事看鸟哥的博客,看到一篇现在PHP主流的几个框架性能对比,比较有意思,给大家分享一下! Yaf是用PHP扩展的形式写的一个PHP框架,也就是以C语 ...

  6. Jmh测试JDK,CGLIB,JAVASSIST动态代理方式的性能

    前言 JDK,CGLIB,JAVASSIST是常用的动态代理方式. JDK动态代理仅能对具有接口的类进行代理. CGLIB动态代理方式的目标类可以没有接口. Javassist是一个开源的分析.编辑和 ...

  7. 盘点Go中的开发神器

    本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 在Java中,我们用Junit做单元测试,用JMH做性能基准测试(benchmark),用as ...

  8. JMH java基准测试

    Measure, don’t guess! JMH适用场景 JMH只适合细粒度的方法测试 原理 编译时会生成一些测试代码,一般都会继承你的类 maven依赖 <dependencies> ...

  9. 【Code Tools】Java微基准测试工具JMH之中级篇

    一.JMH中的基本概念 1)Mode Mode 表示 JMH 进行 Benchmark 时所使用的模式.通常是测量的维度不同,或是测量的方式不同.目前 JMH 共有四种模式: 1.Throughput ...

随机推荐

  1. UVE开发环境搭建及项目启动

    1.IDE安装visual studio code ,略: 2.node安装(node-v10.5.0-win-x64.zip),解压即可: 3.配置node环境变量,cmd 输入node -v.np ...

  2. 利用属性中设置、查看DataContext Command等

    DataContext   1   2   3 示例   1   2 xaml代码自动生成   3

  3. WPF UpdateSourceTrigger的使用

    <Window x:Class="XamlTest.Window8"        xmlns="http://schemas.microsoft.com/winf ...

  4. jquery 可以给事件传参数

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  5. JavaScript关于原型的相关内容

    function Person () { } Person.prototype.name = 'Alan'; Person.prototype.age = 26; Person.prototype.j ...

  6. 内存页面的各种属性(就是Read, Write, Execute的组合)

    PAGE_NOACCESS 禁止写入执行读取查看进程内存区域能发现,NOACCESS属性的内存页面都是FREE状态的(未提交使用的内存区域),只有内存区域最后的0x7FFE1000-0x7FFF000 ...

  7. FC红白机游戏列表(维基百科)

    1055个fc游戏列表 日文名 中文译名 英文版名 发行日期 发行商 ドンキーコング 大金刚 Donkey Kong 1983年7月15日 任天堂 ドンキーコングJR. 大金刚Jr. Donkey K ...

  8. shell产生随机数

    #!/bin/bash # 每次调用$RANDOM都会返回不同的随机整数. # 一般范围为: - (有符号的16-bit整数). MAXCOUNT= count= echo echo "$M ...

  9. 使用AnimateWindow来实现窗口淡入淡出(主要有四种动画,滚动,滑动,折叠或展开,和淡入淡出)

    如果是在VC6下进行编译,应引入下面的预编译宏,注意放在windows.h的前面#undef  WINVER   #define  WINVER   0x500为什么要引入上面的宏呢?看看winuse ...

  10. 海康威视频监控设备Web查看系统(一):概要篇

    声明:本系列文章只提供交流与学习使用.文章中所有涉及到海康威视设备的SDK均可在海康威视官方网站下载得到.文章中所有除官方SDK意外的代码均可随意使用,任何涉及到海康威视公司利益的非正常使用由使用者自 ...