From 3f233267882bba122cbee2a321113047ed115bf3 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 2 Oct 2024 17:06:23 +0800 Subject: [PATCH] add jmh --- hutool-crypto/pom.xml | 2 - hutool-jmh/README.md | 80 ++++++++++++++ hutool-jmh/pom.xml | 101 ++++++++++++++++++ .../hutool/jmh/core}/CharBufferJmh.java | 3 +- .../dromara/hutool/jmh/core/package-info.java | 4 + .../hutool/jmh/json}/BeanToJsonStrJmh.java | 2 +- .../jmh/json}/FromJsonStringStrJmh.java | 2 +- .../dromara/hutool/jmh/json}/JsonAddJmh.java | 2 +- .../dromara/hutool/jmh/json}/JsonPutJmh.java | 2 +- .../hutool/jmh/json}/JsonToStringJmh.java | 2 +- .../hutool/jmh/json}/ParseTreeJmh.java | 2 +- .../dromara/hutool/jmh/json/package-info.java | 4 + hutool-json/pom.xml | 1 - .../org/dromara/hutool/json/JSONUtil.java | 2 +- .../dromara/hutool/json/jmh/package-info.java | 4 - pom.xml | 16 +-- 16 files changed, 200 insertions(+), 29 deletions(-) create mode 100644 hutool-jmh/README.md create mode 100644 hutool-jmh/pom.xml rename {hutool-core/src/test/java/org/dromara/hutool/core/io/buffer => hutool-jmh/src/test/java/org/dromara/hutool/jmh/core}/CharBufferJmh.java (91%) create mode 100644 hutool-jmh/src/test/java/org/dromara/hutool/jmh/core/package-info.java rename {hutool-json/src/test/java/org/dromara/hutool/json/jmh => hutool-jmh/src/test/java/org/dromara/hutool/jmh/json}/BeanToJsonStrJmh.java (98%) rename {hutool-json/src/test/java/org/dromara/hutool/json/jmh => hutool-jmh/src/test/java/org/dromara/hutool/jmh/json}/FromJsonStringStrJmh.java (98%) rename {hutool-json/src/test/java/org/dromara/hutool/json/jmh => hutool-jmh/src/test/java/org/dromara/hutool/jmh/json}/JsonAddJmh.java (97%) rename {hutool-json/src/test/java/org/dromara/hutool/json/jmh => hutool-jmh/src/test/java/org/dromara/hutool/jmh/json}/JsonPutJmh.java (97%) rename {hutool-json/src/test/java/org/dromara/hutool/json/jmh => hutool-jmh/src/test/java/org/dromara/hutool/jmh/json}/JsonToStringJmh.java (97%) rename {hutool-json/src/test/java/org/dromara/hutool/json/jmh => hutool-jmh/src/test/java/org/dromara/hutool/jmh/json}/ParseTreeJmh.java (97%) create mode 100644 hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/package-info.java delete mode 100644 hutool-json/src/test/java/org/dromara/hutool/json/jmh/package-info.java diff --git a/hutool-crypto/pom.xml b/hutool-crypto/pom.xml index c01ad51a1..8f857af1a 100755 --- a/hutool-crypto/pom.xml +++ b/hutool-crypto/pom.xml @@ -34,8 +34,6 @@ org.dromara.hutool.crypto - - 1.78.1 diff --git a/hutool-jmh/README.md b/hutool-jmh/README.md new file mode 100644 index 000000000..74fdd225d --- /dev/null +++ b/hutool-jmh/README.md @@ -0,0 +1,80 @@ +

+ +

+

+ 🍬Make Java Sweet Again. +

+

+ 👉 https://hutool.cn/ 👈 +

+ +## 📚Hutool-jmh 模块介绍 + +`Hutool-jmh`提供性能对比测试 + +## 安装 + +### 引入依赖 + +```xml + + + org.openjdk.jmh + jmh-core + ${jmh.version} + test + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + test + +``` + +### 安装插件 + +IDEA安装`JMH Java Microbenchmark Harness`插件,主页见:https://plugins.jetbrains.com/plugin/7529-jmh-java-microbenchmark-harness + +## 注解说明 + +### @BenchmarkMode +使用哪种模式测试,JMH 提供了4种不同的模式: +- `Mode.Throughput` 吞吐量, ops/time。单位时间内执行操作的平均次数,例如“1秒内可以执行多少次调用” +- `Mode.AverageTime` 平均时间, time/op。 执行每次操作所需的平均时间,例如“每次调用平均耗时xxx毫秒” +- `Mode.SampleTime` 采样时间, time/op。 同 AverageTime。区别在于会统计取样分布,例如“99%的调用在xxx毫秒以内,99.99%的调用在xxx毫秒以内” +- `Mode.SingleShotTime` 单次时间, time。 同 AverageTime。区别在于只执行一次操作。这种模式的结果存在较大随机性,往往同时把 warmup 次数设为0,用于测试冷启动时的性能。 + +### @Warmup和 @Measurement +@Warmup 和@Measurement分别用于配置预热迭代和测试迭代。其中: +- iterations 用于指定迭代次数。 +- time 和 timeUnit 用于每个迭代的时间。 +- batchSize 表示执行多少次 Benchmark为一个invocation。 + +### @State +类注解,JMH 测试类必须使用 @State 注解,它定义了一个类实例的生命周期,有三种类型: +- `Scope.Thread`:每个线程一个实例,适合不共享数据的测试。 +- `Scope.Benchmark`:所有测试线程共享一个实例,用于测试有状态实例在多线程共享下的性能; +- `Scope.Group`:每个线程组共享一个实例; + +### @Fork +进行 fork 的次数。如果 fork 数是2的话,则 JMH 会 fork 出两个进程来进行测试。 + +### @Setup 和 @TearDown +方法注解。 +- `@Setup`会在执行 benchmark 之前被执行,主要用于初始化。 +- `@TearDown`会在执行 benchmark 之后被执行,主要用于资源的回收等。 + +### @Benchmark +方法注解,表示该方法是需要进行 benchmark 的对象。 + +### @OutputTimeUnit +输出的时间单位。 + +### @Param +成员注解,可以用来指定某项参数的多种情况。特别适合用来测试一个函数在不同的参数输入的情况下的性能。@Param 注解接收一个String数组,在 @Setup 方法执行前转化为为对应的数据类型。 +多个 @Param 注解的成员之间是乘积关系,譬如有两个用 @Param 注解的字段,第一个有5个值,第二个字段有2个值,那么每个测试方法会跑5*2=10次。 + +## 参考: + +[如何在 Java 中使用 JMH 进行基准测试](https://segmentfault.com/a/1190000039902797) \ No newline at end of file diff --git a/hutool-jmh/pom.xml b/hutool-jmh/pom.xml new file mode 100644 index 000000000..2106735e5 --- /dev/null +++ b/hutool-jmh/pom.xml @@ -0,0 +1,101 @@ + + + + + 4.0.0 + + jar + + + org.dromara.hutool + hutool-parent + 6.0.0-M17 + + + hutool-jmh + ${project.artifactId} + Hutool 性能测试 + + + org.dromara.hutool.jmh + + true + 1.37 + + 2.17.2 + 2.11.0 + 2.0.41 + 1.15.1 + + + + + org.dromara.hutool + hutool-bom + ${project.parent.version} + pom + test + + + + org.openjdk.jmh + jmh-core + ${jmh.version} + test + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + test + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + true + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson.version} + test + + + com.google.code.gson + gson + ${gson.version} + true + + + com.alibaba.fastjson2 + fastjson2 + ${fastjson2.version} + true + + + com.squareup.moshi + moshi + 1.15.1 + true + + + diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/io/buffer/CharBufferJmh.java b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/core/CharBufferJmh.java similarity index 91% rename from hutool-core/src/test/java/org/dromara/hutool/core/io/buffer/CharBufferJmh.java rename to hutool-jmh/src/test/java/org/dromara/hutool/jmh/core/CharBufferJmh.java index 7dcda187a..1fedbd316 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/io/buffer/CharBufferJmh.java +++ b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/core/CharBufferJmh.java @@ -1,5 +1,6 @@ -package org.dromara.hutool.core.io.buffer; +package org.dromara.hutool.jmh.core; +import org.dromara.hutool.core.io.buffer.FastCharBuffer; import org.openjdk.jmh.annotations.*; import java.util.concurrent.TimeUnit; diff --git a/hutool-jmh/src/test/java/org/dromara/hutool/jmh/core/package-info.java b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/core/package-info.java new file mode 100644 index 000000000..cd70ae541 --- /dev/null +++ b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/core/package-info.java @@ -0,0 +1,4 @@ +/** + * 核心包性能测试 + */ +package org.dromara.hutool.jmh.core; diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/jmh/BeanToJsonStrJmh.java b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/BeanToJsonStrJmh.java similarity index 98% rename from hutool-json/src/test/java/org/dromara/hutool/json/jmh/BeanToJsonStrJmh.java rename to hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/BeanToJsonStrJmh.java index 2234371c5..9b1ef0fe0 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/jmh/BeanToJsonStrJmh.java +++ b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/BeanToJsonStrJmh.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.dromara.hutool.json.jmh; +package org.dromara.hutool.jmh.json; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/jmh/FromJsonStringStrJmh.java b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/FromJsonStringStrJmh.java similarity index 98% rename from hutool-json/src/test/java/org/dromara/hutool/json/jmh/FromJsonStringStrJmh.java rename to hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/FromJsonStringStrJmh.java index 563980099..e78e331bb 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/jmh/FromJsonStringStrJmh.java +++ b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/FromJsonStringStrJmh.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.dromara.hutool.json.jmh; +package org.dromara.hutool.jmh.json; import com.fasterxml.jackson.databind.JsonNode; import com.google.gson.JsonElement; diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/jmh/JsonAddJmh.java b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/JsonAddJmh.java similarity index 97% rename from hutool-json/src/test/java/org/dromara/hutool/json/jmh/JsonAddJmh.java rename to hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/JsonAddJmh.java index d6c5854e6..2fb74f146 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/jmh/JsonAddJmh.java +++ b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/JsonAddJmh.java @@ -1,4 +1,4 @@ -package org.dromara.hutool.json.jmh; +package org.dromara.hutool.jmh.json; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/jmh/JsonPutJmh.java b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/JsonPutJmh.java similarity index 97% rename from hutool-json/src/test/java/org/dromara/hutool/json/jmh/JsonPutJmh.java rename to hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/JsonPutJmh.java index e2b2cb91e..1f95dbd7c 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/jmh/JsonPutJmh.java +++ b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/JsonPutJmh.java @@ -1,4 +1,4 @@ -package org.dromara.hutool.json.jmh; +package org.dromara.hutool.jmh.json; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/jmh/JsonToStringJmh.java b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/JsonToStringJmh.java similarity index 97% rename from hutool-json/src/test/java/org/dromara/hutool/json/jmh/JsonToStringJmh.java rename to hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/JsonToStringJmh.java index 42d034992..430ff9edd 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/jmh/JsonToStringJmh.java +++ b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/JsonToStringJmh.java @@ -1,4 +1,4 @@ -package org.dromara.hutool.json.jmh; +package org.dromara.hutool.jmh.json; import com.alibaba.fastjson2.JSON; import com.google.gson.JsonElement; diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/jmh/ParseTreeJmh.java b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/ParseTreeJmh.java similarity index 97% rename from hutool-json/src/test/java/org/dromara/hutool/json/jmh/ParseTreeJmh.java rename to hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/ParseTreeJmh.java index 36b9aa416..ea39f009b 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/jmh/ParseTreeJmh.java +++ b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/ParseTreeJmh.java @@ -1,4 +1,4 @@ -package org.dromara.hutool.json.jmh; +package org.dromara.hutool.jmh.json; import com.alibaba.fastjson2.JSON; import com.fasterxml.jackson.core.JsonProcessingException; diff --git a/hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/package-info.java b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/package-info.java new file mode 100644 index 000000000..119f7a300 --- /dev/null +++ b/hutool-jmh/src/test/java/org/dromara/hutool/jmh/json/package-info.java @@ -0,0 +1,4 @@ +/** + * JSON性能测试 + */ +package org.dromara.hutool.jmh.json; diff --git a/hutool-json/pom.xml b/hutool-json/pom.xml index 8326fd31e..7442c27bc 100755 --- a/hutool-json/pom.xml +++ b/hutool-json/pom.xml @@ -35,7 +35,6 @@ org.dromara.hutool.json - 1.78.1 0.12.6 2.17.2 2.11.0 diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/JSONUtil.java b/hutool-json/src/main/java/org/dromara/hutool/json/JSONUtil.java index 2376c7995..4097147a4 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/JSONUtil.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/JSONUtil.java @@ -434,7 +434,7 @@ public class JSONUtil { * 转换对象为JSON,如果用户不配置JSONConfig,则JSON的有序与否与传入对象有关。
* 支持的对象: *
    - *
  • boolean、Number、String: 转换为{@link JSONPrimitive}/li> + *
  • boolean、Number、String: 转换为{@link JSONPrimitive}
  • *
  • Array、Iterable、Iterator:转换为{@link JSONArray}
  • *
  • Bean对象:转为{@link JSONObject}
  • *
diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/jmh/package-info.java b/hutool-json/src/test/java/org/dromara/hutool/json/jmh/package-info.java deleted file mode 100644 index 1664fe97a..000000000 --- a/hutool-json/src/test/java/org/dromara/hutool/json/jmh/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 测试包,用于JMH基准测试 - */ -package org.dromara.hutool.json.jmh; diff --git a/pom.xml b/pom.xml index e4a9b140c..5db353a7b 100755 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,7 @@ hutool-poi hutool-socket hutool-swing + hutool-jmh @@ -58,7 +59,7 @@ 5.10.3 1.18.34 1.9.25 - 1.37 + 1.78.1 @@ -82,19 +83,6 @@ ${lombok.version} test - - - org.openjdk.jmh - jmh-core - ${jmh.version} - test - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - test -