gpt4 book ai didi

java - 为什么对 UUID.randomUUID() 的初始调用很慢?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:22:12 24 4
gpt4 key购买 nike

给定以下生成 UUID.randomUUID() 的代码片段,我得到以下性能结果(以毫秒为单位):

public static void main(String[] args) {
long tmp = System.currentTimeMillis();
UUID.randomUUID();
tmp = printDiff(tmp);
UUID.randomUUID();
tmp = printDiff(tmp);
UUID.randomUUID();
tmp = printDiff(tmp);
UUID.randomUUID();
tmp = printDiff(tmp);
}

private static long printDiff(final long previousTimestamp) {
long tmp = System.currentTimeMillis();
System.out.printf("%s%n", tmp - previousTimestamp);
return tmp;
}

结果:

971
6
0
0

JDK: 1.8操作系统:Windows 7

为什么只有初始调用需要这么长时间? (将近 1 秒!)

最佳答案

这是一次完成的 SecureRandom 的初始化:

//from the source code of randomUUID
private static class Holder {
static final SecureRandom numberGenerator = new SecureRandom();
}

但这还不是全部。那些零真的应该跳到你的脸上。所以操作耗时0毫秒;这是否意味着他们拿的少了?比如几纳秒,或者你做错了什么?

有一个合适的工具可以衡量这些东西,叫做 jmh。

@BenchmarkMode({ Mode.AverageTime, Mode.SingleShotTime })
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@Warmup(iterations = 2, time = 2, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 2, time = 2, timeUnit = TimeUnit.SECONDS)
@State(Scope.Benchmark)
public class UUIDRandom {

public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder().include(UUIDRandom.class.getSimpleName()).build();
new Runner(opt).run();
}

@Benchmark
@Fork(1)
public UUID random() {
return UUID.randomUUID();
}
}

输出结果为:

Benchmark          Mode  Cnt  Score   Error  Units
UUIDRandom.random avgt 2 0.002 ms/op
UUIDRandom.random ss 2 0.094 ms/op

确实,单发时间比平均水平差得多。

关于java - 为什么对 UUID.randomUUID() 的初始调用很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41797743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com