baidu / uid-generator

UniqueID generator
Apache License 2.0
5.46k stars 1.55k forks source link

DefaultUidGenerator的性能问题 #20

Closed vision-ken closed 5 years ago

vision-ken commented 5 years ago

对比了原生的snowflake和DefaultUidGenerator的性能,在同样的测试环境下:

消耗时间对比:

是什么导致两者差距这么明显呢?分析代码后,怀疑是DefaultUidGenerator的getNextSecond()方法阻塞了请求导致性能的急剧下降。因为DefaultUidGenerator是按秒为单位去阻塞的,而原生的snowflake是按毫秒阻塞的。对比两者的阻塞次数:

从中分析可以得知,DefaultUidGenerator的getNextSecond()方法确实是造成性能急剧下降的罪魁祸首,因为在10万次id生成的过程中,阻塞了24次,尽管每次不一定到1秒(取决于该秒内序列号被使用完时距离1秒结束的时间差),但是结论应该是显而易见的。

为了验证这个结论,我将DefaultUidGenerator改成毫秒级别,重新测试DefaultUidGenerator.testSerialGenerate(),消耗时间降到了:38ms。

所以,毫秒级序列号的设计比秒级序列号设计性能要高得多。

baozhi commented 5 years ago

DefaultUidGenerator,单位时间内sequence长度就是天花板。毫秒级单位时间方案,虽然可以提升吞吐,但是可用结点数、sequence数就要收到积压(总共63bits)

如果对并发性能有要求,建议使用CachedUidGenerator实现