diff --git a/Java/source/pom.xml b/Java/source/pom.xml index bb41e2a..0d8f601 100644 --- a/Java/source/pom.xml +++ b/Java/source/pom.xml @@ -45,7 +45,20 @@ 1.8 1.8 - + + + org.openjdk.jmh + jmh-core + 1.21 + provided + + + org.openjdk.jmh + jmh-generator-annprocess + 1.21 + provided + + diff --git a/Java/source/src/main/java/com/github/yitter/test/GenTest.java b/Java/source/src/test/java/com/github/yitter/test/GenTest.java similarity index 90% rename from Java/source/src/main/java/com/github/yitter/test/GenTest.java rename to Java/source/src/test/java/com/github/yitter/test/GenTest.java index 09430a4..036ec86 100644 --- a/Java/source/src/main/java/com/github/yitter/test/GenTest.java +++ b/Java/source/src/test/java/com/github/yitter/test/GenTest.java @@ -1,8 +1,6 @@ package com.github.yitter.test; -import com.github.yitter.contract.IIdGenerator; import com.github.yitter.idgen.YitIdHelper; - import java.util.HashSet; import java.util.Set; diff --git a/Java/source/src/test/java/com/github/yitter/test/README.md b/Java/source/src/test/java/com/github/yitter/test/README.md new file mode 100644 index 0000000..571f6c4 --- /dev/null +++ b/Java/source/src/test/java/com/github/yitter/test/README.md @@ -0,0 +1,7 @@ +JMH 基准测试 漂移算法 macbook pro 13(2020) i5 jdk1.8.0_301 +``` +Benchmark Mode Cnt Score Error Units +StartUpJmh.testGetPojo thrpt 40 58835.536 ± 535.605 ops/s +StartUpJmh.testGetPojo avgt 40 ≈ 10⁻⁵ s/op +``` + diff --git a/Java/source/src/main/java/com/github/yitter/test/StartUp.java b/Java/source/src/test/java/com/github/yitter/test/StartUp.java similarity index 90% rename from Java/source/src/main/java/com/github/yitter/test/StartUp.java rename to Java/source/src/test/java/com/github/yitter/test/StartUp.java index 359c88b..a2334d4 100644 --- a/Java/source/src/main/java/com/github/yitter/test/StartUp.java +++ b/Java/source/src/test/java/com/github/yitter/test/StartUp.java @@ -1,8 +1,6 @@ package com.github.yitter.test; -import com.github.yitter.contract.IIdGenerator; import com.github.yitter.contract.IdGeneratorOptions; -import com.github.yitter.idgen.DefaultIdGenerator; import com.github.yitter.idgen.YitIdHelper; public class StartUp { diff --git a/Java/source/src/test/java/com/github/yitter/test/StartUpJmh.java b/Java/source/src/test/java/com/github/yitter/test/StartUpJmh.java new file mode 100644 index 0000000..5ba25f7 --- /dev/null +++ b/Java/source/src/test/java/com/github/yitter/test/StartUpJmh.java @@ -0,0 +1,62 @@ +package com.github.yitter.test; + +import com.github.yitter.contract.IdGeneratorOptions; +import com.github.yitter.idgen.YitIdHelper; +import java.util.concurrent.TimeUnit; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Threads; +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; + +/** + * @author suzhenyu + * @date 2021/9/27 + */ +// 测试方法平均执行时间 +@BenchmarkMode({Mode.All}) +// 输出结果的时间粒度为微秒 +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@State(Scope.Thread) +//@Threads(2) +public class StartUpJmh { + + //1-漂移算法,2-传统算法 + final static short method = 1; + + public static void main(String[] args) throws RunnerException { + Options options = new OptionsBuilder().include(StartUpJmh.class.getSimpleName()) + .warmupIterations(1).measurementIterations(5).forks(1).build(); + new Runner(options).run(); + } + + /** + * setup初始化容器的时候只执行一次 + */ + @Setup(Level.Trial) + public void init() { + IdGeneratorOptions options = new IdGeneratorOptions(); + options.WorkerIdBitLength = 6; + options.SeqBitLength = 10; + options.BaseTime = System.currentTimeMillis(); + options.Method = method; + options.WorkerId = 1; + + // 首先测试一下 IdHelper 方法,获取单个Id + YitIdHelper.setIdGenerator(options); + YitIdHelper.nextId(); + } + + @Benchmark + public void testNextId() { + YitIdHelper.nextId(); + } +} diff --git a/Java/source/src/test/java/com/github/yitter/test/StartUpJmh2.java b/Java/source/src/test/java/com/github/yitter/test/StartUpJmh2.java new file mode 100644 index 0000000..07632b0 --- /dev/null +++ b/Java/source/src/test/java/com/github/yitter/test/StartUpJmh2.java @@ -0,0 +1,63 @@ +package com.github.yitter.test; + +import com.github.yitter.contract.IdGeneratorOptions; +import com.github.yitter.idgen.YitIdHelper; +import java.util.concurrent.TimeUnit; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Threads; +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; + +/** + * @author suzhenyu + * @date 2021/9/27 + */ +// 测试方法平均执行时间 +@BenchmarkMode({Mode.All}) +// 输出结果的时间粒度为微秒 +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@State(Scope.Thread) +//@Threads(2) +public class StartUpJmh2 { + + //1-漂移算法,2-传统算法 + final static short method = 2; + + public static void main(String[] args) throws RunnerException { + Options options = new OptionsBuilder().include(StartUpJmh2.class.getName() + ".*") + .warmupIterations(1).measurementIterations(5).forks(2).build(); + new Runner(options).run(); + } + + /** + * setup初始化容器的时候只执行一次 + */ + @Setup(Level.Trial) + public void init() { + IdGeneratorOptions options = new IdGeneratorOptions(); + options.WorkerIdBitLength = 6; + options.SeqBitLength = 10; + options.BaseTime = System.currentTimeMillis(); + options.Method = method; + options.WorkerId = 1; + + // 首先测试一下 IdHelper 方法,获取单个Id + YitIdHelper.setIdGenerator(options); + YitIdHelper.nextId(); + } + + @Benchmark + public void testGetPojo() { + + YitIdHelper.nextId(); + } +} diff --git a/README.md b/README.md index b82dabc..8f515fa 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ QQ群:646049993 ❄ 兼容所有雪花算法(号段模式或经典模式,大厂或小厂),将来你可做任意的升级切换。(一般无须升级,但理论上支持) -❄ 这是计算机历史上最全面的雪花ID生成工具,期待你来超越😀 +❄ 这是计算机历史上最全面的雪花ID生成工具。 #### 需求来源 @@ -108,7 +108,7 @@ QQ群:646049993 387750301904971 (运行3年) 646093214093387 (运行5年) 1292658282840139 (运行10年) -9007199254740992 (js Number 最大值) +9007199254740992 (js Number 最大值,可以支撑70年) 165399880288699493 (普通雪花算法生成的ID) ``` @@ -160,7 +160,7 @@ QQ群:646049993 第二版增加参数(非必须): -❄ ***DataCenterId***,数据中心ID(默认0),请确保全局唯一。 +❄ ***DataCenterId***,数据中心ID(机房ID,默认0),请确保全局唯一。 ❄ ***DataCenterIdBitLength***,数据中心ID长度(默认0)。 @@ -211,7 +211,7 @@ QQ群:646049993 🔍 当然,如果你的服务无需自动扩容,那就不必自动注册WorkerId,而是为它们分别设置全局唯一值。 -🔍 发挥你的想象力,方法还有很多。此处抛砖引玉:开发中心化的ID生成服务,由它为各端点服务(单个或批量)生成可用ID。 +🔍 方法还有很多,例如:开发中心化的ID生成服务,由它为各端点服务(单个或批量)生成可用ID。 #### 自动注册流程图 diff --git a/TypeScript/README.md b/TypeScript/README.md index f5c2347..3ec4af6 100644 --- a/TypeScript/README.md +++ b/TypeScript/README.md @@ -168,6 +168,53 @@ $ ts-node test/test4.ts 8 ID:30043877339570182 bigint 长度:17 9 ID:30043877339570183 bigint 长度:17 +<<<<<<< HEAD +======= + + + + + + + + + + + + + + + +``` + +## 同时兼容number和bigint的写法 + +如果您觉得这个用法更好,可以手动替换对应方法 + +```js + /** + * 生成ID + * @returns + */ + public NextId(): number | bigint { + if (this._IsOverCost) { + // + let id = this.NextOverCostId() + if (id >= 9007199254740992n) + return id + else + return parseInt(id.toString()) + } else { + // + let id = this.NextNormalId() + if (id >= 9007199254740992n) + return id + else + return parseInt(id.toString()) + } + } + +>>>>>>> 91459b1538b24a03174b20eba10db410d8ef5268 ``` ## 其他帮助 diff --git a/TypeScript/snowflakeIdv1.ts b/TypeScript/snowflakeIdv1.ts index 0d4f75f..9eb8387 100644 --- a/TypeScript/snowflakeIdv1.ts +++ b/TypeScript/snowflakeIdv1.ts @@ -372,7 +372,11 @@ export class snowflakeIdv1 { * 生成ID * @returns 始终输出bigint类型 */ +<<<<<<< HEAD public NextBigId(): bigint { +======= + public NextId(): bigint { +>>>>>>> 91459b1538b24a03174b20eba10db410d8ef5268 if (this._IsOverCost) { // return this.NextOverCostId()