gpt4 book ai didi

java - 同步代码比非同步代码执行得更快

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

我得出了这个惊人的结果,我完全不知道原因是什么:我有两种缩短为的方法:

private static final ConcurrentHashMap<Double,Boolean> mapBoolean = 
new ConcurrentHashMap<Double, Boolean>();
private static final ConcurrentHashMap<Double,LinkedBlockingQueue<Runnable>> map
= new ConcurrentHashMap<Double, LinkedBlockingQueue<Runnable>>();


protected static <T> Future<T> execute(final Double id, Callable<T> call){
// where id is the ID number of each thread
synchronized(id)
{
mapBoolean.get();// then do something with the result
map.get();//the do somethign with the result
}
}

protected static <T> Future<T> executeLoosely(final Double id, Callable<T> call){

mapBoolean.get();// then do something with the result
map.get();//the do somethign with the result

}

在分析超过 500 个线程时,每个线程调用上述每个方法 400 次,我发现 execute(..) 的性能至少比 executeLoosely(..) 好 500 倍,这很奇怪,因为 executeLoosely 不是同步,因此更多线程可以同时处理代码。

有什么原因吗??

最佳答案

在我假设没有 500 个内核的机器上使用 500 个线程的开销,使用需要大约 100-1000 倍的任务只要在 Map 上查找以执行 JVM 可以检测到的代码不会执行任何事情,都可能产生随机结果。 ;)

您可能遇到的另一个问题是,使用一个线程执行速度更快的测试可以从使用 synchronized 中获益,因为它偏向于对一个线程的访问。即,它将您的多线程测试变回单线程测试,这首先是最快的。

您应该将获得的时间与执行循环的单个线程进行比较。如果这更快(我相信它会更快),那么它不是一个有用的多线程测试。

我的猜测是您在非同步代码之后运行同步代码。即在 JVM 稍微预热之后。交换执行这些测试的顺序并多次运行它们,您将得到不同的结果。

关于java - 同步代码比非同步代码执行得更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7371089/

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