追求更快更全的 Java 工具类。
和 Hutool 的性能对比测试请查看 jmh.contrast。
- 更快:使用 JMH 进行性能测试。
- 更全:时间工具类近 120 个方法,2500+ 行;正则工具类近 50 个方法,750+ 行。其他工具类也在持续更新中……
- 更安全:使用 JUnit 进行套件测试,JaCoCo 进行代码覆盖率测试,保证每行代码都符合预期,更少出 BUG。
-
Maven:
<dependency> <groupId>top.csaf</groupId> <artifactId>ZUtil</artifactId> <version>1.11.0</version> </dependency>
-
Gradle
// groovy implementation 'top.csaf:ZUtil:1.11.0' // kotlin implementation("top.csaf:ZUtil:1.11.0")
// Benchmark Mode Cnt Score Error Units
// ToPinyinTest.toPinyinByHutool thrpt 5 2.880 ± 0.160 ops/us
// ToPinyinTest.toPinyinByZUtil thrpt 5 4.577 ± 0.133 ops/us
// ToPinyinTest.toPinyinByHutool avgt 5 0.356 ± 0.012 us/op
// ToPinyinTest.toPinyinByZUtil avgt 5 0.216 ± 0.006 us/op
// ToPinyinTest.toPinyinByHutool sample 175058 0.435 ± 0.008 us/op
// ToPinyinTest.toPinyinByHutool:toPinyinByHutool·p0.00 sample 0.300 us/op
// ToPinyinTest.toPinyinByHutool:toPinyinByHutool·p0.50 sample 0.400 us/op
// ToPinyinTest.toPinyinByHutool:toPinyinByHutool·p0.90 sample 0.500 us/op
// ToPinyinTest.toPinyinByHutool:toPinyinByHutool·p0.95 sample 0.500 us/op
// ToPinyinTest.toPinyinByHutool:toPinyinByHutool·p0.99 sample 0.900 us/op
// ToPinyinTest.toPinyinByHutool:toPinyinByHutool·p0.999 sample 1.600 us/op
// ToPinyinTest.toPinyinByHutool:toPinyinByHutool·p0.9999 sample 40.900 us/op
// ToPinyinTest.toPinyinByHutool:toPinyinByHutool·p1.00 sample 277.504 us/op
// ToPinyinTest.toPinyinByZUtil sample 162384 0.393 ± 0.008 us/op
// ToPinyinTest.toPinyinByZUtil:toPinyinByZUtil·p0.00 sample 0.200 us/op
// ToPinyinTest.toPinyinByZUtil:toPinyinByZUtil·p0.50 sample 0.300 us/op
// ToPinyinTest.toPinyinByZUtil:toPinyinByZUtil·p0.90 sample 0.500 us/op
// ToPinyinTest.toPinyinByZUtil:toPinyinByZUtil·p0.95 sample 0.600 us/op
// ToPinyinTest.toPinyinByZUtil:toPinyinByZUtil·p0.99 sample 1.000 us/op
// ToPinyinTest.toPinyinByZUtil:toPinyinByZUtil·p0.999 sample 2.500 us/op
// ToPinyinTest.toPinyinByZUtil:toPinyinByZUtil·p0.9999 sample 45.425 us/op
// ToPinyinTest.toPinyinByZUtil:toPinyinByZUtil·p1.00 sample 170.496 us/op
// ToPinyinTest.toPinyinByHutool ss 5 30.880 ± 37.754 us/op
// ToPinyinTest.toPinyinByZUtil ss 5 23.060 ± 16.885 us/op
Mode 即为org.openjdk.jmh.annotations.Mode
,分为:
- thrpt:Throughput(吞吐量), ops/time,分数越大越好
- avgt:Average time(平均时间), time/op,分数越小越好
- sample:Sampling time(采样时间),分数越小越好
- ss:Single shot invocation time(单次调用时间):分数越小越好
- Fork 并 Clone 项目到本地。
- 开发:
- 新增类或方法需提前加群沟通。
- 修复 BUG(fix)、优化性能(perf)或新增/更正测试(test)。
- 测试:
- 使用
org.junit.jupiter.api.Assertions
进行代码覆盖率测试:
…… import static org.junit.jupiter.api.Assertions.*; @Slf4j @DisplayName("NanoId 工具类测试") class NanoIdUtilsTest { @DisplayName("生成 NanoID") @Test void randomNanoId() { /** {@link top.csaf.id.NanoIdUtils#randomNanoId(int, char[], java.util.Random) } */ assertThrows(NullPointerException.class, () -> NanoIdUtils.randomNanoId(0, (char[]) null, NanoIdUtils.DEFAULT_ID_GENERATOR)); assertThrows(NullPointerException.class, () -> NanoIdUtils.randomNanoId(0, new char[0], null)); assertThrows(IllegalArgumentException.class, () -> NanoIdUtils.randomNanoId(0, new char[0], NanoIdUtils.DEFAULT_ID_GENERATOR)); assertThrows(IllegalArgumentException.class, () -> NanoIdUtils.randomNanoId(1, new char[0], NanoIdUtils.DEFAULT_ID_GENERATOR)); assertThrows(IllegalArgumentException.class, () -> NanoIdUtils.randomNanoId(1, new char[256], NanoIdUtils.DEFAULT_ID_GENERATOR)); assertDoesNotThrow(() -> NanoIdUtils.randomNanoId(NanoIdUtils.DEFAULT_SIZE, NanoIdUtils.DEFAULT_ALPHABET, NanoIdUtils.DEFAULT_ID_GENERATOR)); } }
- Maven
test
进行测试,测试后会在target
下生成jacoco.exec
。 - Maven
jacoco:report
生成代码覆盖率测试报告,在target/site
目录下。 - 查看更新的类或方法,覆盖率在 90% 以上时提交。
- 使用
- 提交时遵循 Angular 提交消息规范,提交后新建 pull request 即可。