uuid生成器_UUID 生成器有多快?

在 Java 中,我们常用 UUID.randomUUID() 来随机生成一个 UUID。但在某些极端的情况下,它的性能可能满足不了你的要求(虽然几乎不可能出现)。这里我们测试了 4 种 UUID 生成器的性能。

测试结果

最终测试的结果如下(虽然只看到 3 根线,但其实有 4 根,其中蓝线 UUID.randomUUID 与绿线 jugWithSecureRandom 几乎重合):

e13fc0508842244ba8db5d5444f66305.png

可以看到:

  • 在单线程时,jugWithRandom 远远超过其它的生成器,而 jugTime 次之。

  • 随着线程的增加,各生成器的吞吐均有所下降。

    synchronized
  • 注意 jugTime 在单线程时吞吐接近 1w/ms,这也是基于时间的 UUID 每毫秒能拥有的最大数值(参考 uuid-timebased 说明 )。

  • jugTime 的生成器的性能几乎总是优于 randomUUID 。

  • 不过现实中,不太能遇到有场景需要有 1k/ms 这样的吞吐需求。

测试设置

这里我们测试了 java 内置的 UUID.randomUUID() , java-uuid-generator 的 TimeBasedGenerator 和 RandomBasedGenerator ,而其中随机数发生器分别选用 Random 和 SecureRandom 。 测试代码 如下:

@BenchmarkMode({Mode.Throughput})
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Benchmark)
@Warmup(iterations = 5)
public class MyBenchmark {
private RandomBasedGenerator randomBasedGenerator;
private RandomBasedGenerator jugRandomGenerator;
private TimeBasedGenerator timeBasedGenerator;
@Setup
public void init() {
randomBasedGenerator = Generators.randomBasedGenerator();
timeBasedGenerator = Generators.timeBasedGenerator();
jugRandomGenerator = Generators.randomBasedGenerator(new Random());
}
@Benchmark
public void UUIDRandomUUID(Blackhole bh) {
bh.consume(UUID.randomUUID());
}
@Benchmark
public void jugWithRandom(Blackhole bh) {
bh.consume(jugRandomGenerator.generate());
}
@Benchmark
public void jugWithSecureRandom(Blackhole bh) {
bh.consume(randomBasedGenerator.generate());
}
@Benchmark
public void jugTime(Blackhole bh) {
bh.consume(timeBasedGenerator.generate());
}
}

测试框架使用 Jmh。测试使用 jdk 1.8 在 8C MacBook Pro 下完成,分别测试了 1,2,4,8 个线程下的吞吐。

写在后面

这个测试的起因是产品在压测的时候发现 UUID 生成占 Running 线程较大的部分,且 JProfiler 的线程图中有许多线程是 Blocking 的状态,因此猜测是 UUID.randomUUID中的synchronized 导致线程同步慢,所以想找一些替代的生成器。最后发现 UUID.randomUUID 的吞吐并不是什么大的问题,但也很庆幸做了这个测试,了解了 UUID 生成器的能力,还有 Time-Based UUID 也是一个不错的选择。

原文 https://lotabout.me/2019/UUID-Generator-Benchmark/

5602ca70fa6d33befdbdcf2648e58a85.png

目前100000+人已关注加入我们

6296061f2961d4cede88d3d39a82acec.gif 0d6c52e4c139382ac55bf70eb5cef5d3.gif e726e241bbf4476da8e3bd72feb34483.gif f9f33d66438d47d5ee19566daa2c5f77.gif 969c079c4bc1af8ce750616a9f448228.gif 50df2df51c2e265349c90e25bf0ca9dc.gif 04715962a6059dabfb4353da72579edc.gif 4128a80c48498e70d9aceb08d3c1c464.gif

f0e258278c2194ef700ae54a9837ee99.gif fb8592253625a4f151b96b39f0bb7eb8.gif f69ebbd6a05c857c41834657b59801d0.gif 9f2d91ea2769b1163ba6a470d5ba7437.gif 9a3e7fb263f69c60ecc587b7ff8fac5d.gif 853f12fa604531d07b47034edbfc8322.gif ff9ac274cda38e8603483f9aa96eb3dc.gif 969c079c4bc1af8ce750616a9f448228.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值