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()