gpt4 book ai didi

java - 多线程环境中的基准测试

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:22:23 27 4
gpt4 key购买 nike

我正在学习多线程,发现在多线程环境中 Object.hashCode 速度变慢,因为它需要两倍的时间来计算运行 4 个线程的默认哈希码> 对于相同数量的对象,对比 1 个线程

但根据我的理解,并行执行此操作应该花费类似的时间。

您可以更改线程数。每个线程都有相同数量的工作要做,所以你希望在我的四核机器上运行 4 个线程可能花费与运行单个线程相同的时间。

我看到 4 倍大约 2.3 秒,但 1 倍 0.9 秒。

我的理解是否有任何差距,请帮助我理解这种行为。

public class ObjectHashCodePerformance {

private static final int THREAD_COUNT = 4;
private static final int ITERATIONS = 20000000;

public static void main(final String[] args) throws Exception {
long start = System.currentTimeMillis();
new ObjectHashCodePerformance().run();
System.err.println(System.currentTimeMillis() - start);
}

private final ExecutorService _sevice = Executors.newFixedThreadPool(THREAD_COUNT,
new ThreadFactory() {
private final ThreadFactory _delegate = Executors.defaultThreadFactory();

@Override
public Thread newThread(final Runnable r) {
Thread thread = _delegate.newThread(r);
thread.setDaemon(true);
return thread;
}
});

private void run() throws Exception {
Callable<Void> work = new java.util.concurrent.Callable<Void>() {
@Override
public Void call() throws Exception {
for (int i = 0; i < ITERATIONS; i++) {
Object object = new Object();
object.hashCode();
}
return null;
}
};
@SuppressWarnings("unchecked")
Callable<Void>[] allWork = new Callable[THREAD_COUNT];
Arrays.fill(allWork, work);
List<Future<Void>> futures = _sevice.invokeAll(Arrays.asList(allWork));
for (Future<Void> future : futures) {
future.get();
}
}

}

对于线程数为 4 的输出是

~2.3 seconds

对于线程数为 1 的输出是

~.9 seconds

最佳答案

我创建了一个简单的 JMH 基准来测试各种情况:

@Fork(1)
@State(Scope.Benchmark)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Measurement(iterations = 10)
@Warmup(iterations = 10)
@BenchmarkMode(Mode.AverageTime)
public class HashCodeBenchmark {
private final Object object = new Object();

@Benchmark
@Threads(1)
public void singleThread(Blackhole blackhole){
blackhole.consume(object.hashCode());
}

@Benchmark
@Threads(2)
public void twoThreads(Blackhole blackhole){
blackhole.consume(object.hashCode());
}

@Benchmark
@Threads(4)
public void fourThreads(Blackhole blackhole){
blackhole.consume(object.hashCode());
}

@Benchmark
@Threads(8)
public void eightThreads(Blackhole blackhole){
blackhole.consume(object.hashCode());
}
}

结果如下:

Benchmark                       Mode  Cnt  Score   Error  Units
HashCodeBenchmark.eightThreads avgt 10 5.710 ± 0.087 ns/op
HashCodeBenchmark.fourThreads avgt 10 3.603 ± 0.169 ns/op
HashCodeBenchmark.singleThread avgt 10 3.063 ± 0.011 ns/op
HashCodeBenchmark.twoThreads avgt 10 3.067 ± 0.034 ns/op

因此我们可以看到,只要线程数不多于内核数,每个哈希码的时间就保持不变。

PS:正如@Tom Cools 所评论的那样 - 您正在测量分配速度,而不是测试中的 hashCode() 速度。

关于java - 多线程环境中的基准测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34313748/

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