Closed vision-ken closed 5 years ago
对比了原生的snowflake和DefaultUidGenerator的性能,在同样的测试环境下:
消耗时间对比:
是什么导致两者差距这么明显呢?分析代码后,怀疑是DefaultUidGenerator的getNextSecond()方法阻塞了请求导致性能的急剧下降。因为DefaultUidGenerator是按秒为单位去阻塞的,而原生的snowflake是按毫秒阻塞的。对比两者的阻塞次数:
从中分析可以得知,DefaultUidGenerator的getNextSecond()方法确实是造成性能急剧下降的罪魁祸首,因为在10万次id生成的过程中,阻塞了24次,尽管每次不一定到1秒(取决于该秒内序列号被使用完时距离1秒结束的时间差),但是结论应该是显而易见的。
为了验证这个结论,我将DefaultUidGenerator改成毫秒级别,重新测试DefaultUidGenerator.testSerialGenerate(),消耗时间降到了:38ms。
所以,毫秒级序列号的设计比秒级序列号设计性能要高得多。
DefaultUidGenerator,单位时间内sequence长度就是天花板。毫秒级单位时间方案,虽然可以提升吞吐,但是可用结点数、sequence数就要收到积压(总共63bits)
如果对并发性能有要求,建议使用CachedUidGenerator实现
对比了原生的snowflake和DefaultUidGenerator的性能,在同样的测试环境下:
消耗时间对比:
是什么导致两者差距这么明显呢?分析代码后,怀疑是DefaultUidGenerator的getNextSecond()方法阻塞了请求导致性能的急剧下降。因为DefaultUidGenerator是按秒为单位去阻塞的,而原生的snowflake是按毫秒阻塞的。对比两者的阻塞次数:
从中分析可以得知,DefaultUidGenerator的getNextSecond()方法确实是造成性能急剧下降的罪魁祸首,因为在10万次id生成的过程中,阻塞了24次,尽管每次不一定到1秒(取决于该秒内序列号被使用完时距离1秒结束的时间差),但是结论应该是显而易见的。
为了验证这个结论,我将DefaultUidGenerator改成毫秒级别,重新测试DefaultUidGenerator.testSerialGenerate(),消耗时间降到了:38ms。
所以,毫秒级序列号的设计比秒级序列号设计性能要高得多。