@@ -45,7 +45,20 @@ | |||
<maven.compiler.target>1.8</maven.compiler.target> | |||
<java.version>1.8</java.version> | |||
</properties> | |||
<dependencies> | |||
<dependency> | |||
<groupId>org.openjdk.jmh</groupId> | |||
<artifactId>jmh-core</artifactId> | |||
<version>1.21</version> | |||
<scope>provided</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.openjdk.jmh</groupId> | |||
<artifactId>jmh-generator-annprocess</artifactId> | |||
<version>1.21</version> | |||
<scope>provided</scope> | |||
</dependency> | |||
</dependencies> | |||
<build> | |||
<plugins> | |||
<plugin> | |||
@@ -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; | |||
@@ -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 | |||
``` | |||
@@ -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 { |
@@ -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(); | |||
} | |||
} |
@@ -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(); | |||
} | |||
} |
@@ -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。 | |||
#### 自动注册流程图 | |||
@@ -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 | |||
``` | |||
## 其他帮助 | |||