UUID 生成器有多快?

栏目: Java · 发布时间: 6年前

内容简介:在 Java 中,我们常用最终测试的结果如下(虽然只看到 3 根线,但其实有 4 根,其中蓝线 UUID.randomUUID 与绿线 jugWithSecureRandom 几乎重合):可以看到:

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

测试结果

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

UUID 生成器有多快?

可以看到:

  • 在单线程时,jugWithRandom 远远超过其它的生成器,而 jugTime 次之。
  • 随着线程的增加,各生成器的吞吐均有所下降。
    synchronized
    
  • 注意 jugTime 在单线程时吞吐接近 1w/ms,这也是基于时间的 UUID 每毫秒能拥有的最大数值(参考 uuid-timebased 说明 )。
  • jugTime 的生成器的性能几乎总是优于 randomUUID
  • 不过现实中,不太能遇到有场景需要有 1k/ms 这样的吞吐需求。

测试设置

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

@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 也是一个不错的选择。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

微积分的历程

微积分的历程

William Dunham / 李伯民、汪军、张怀勇 / 人民邮电出版社 / 2010-8 / 29.00元

“微积分”这一名称最早出现在哪本书中?第一本微积分教科书又是谁人所写?微积分究竟是谁人发明的?著名的洛必达法则居然是伯努利的研究成果?谁被誉为“分析学的化身”?谁又被誉为“现代分析学之父”?哪些数学天才使微积分的创建过程终于画上完美的句号?……本书将带你一一探究上述问题。 本书宛如一座陈列室,汇聚了十多位数学大师的杰作,当你徜徉其中时会对人类的想象力惊叹不已,当你离去时必然满怀对天才们的钦佩......一起来看看 《微积分的历程》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具