gpt4 book ai didi

java - 为什么在Java 8中,执行程序服务比顺序操作花费更多的时间?

转载 作者:行者123 更新时间:2023-12-03 12:58:58 24 4
gpt4 key购买 nike

在下面的程序中,我想对4个不同的数组进行并行排序,因此使用executorService创建大小为4(可用处理器数)的FixedThreadPool。
我认为与顺序操作相比,它将花费更少的时间,但是我看到顺序操作更快。这里需要任何进一步的优化吗?

这是代码:

public class ThreadFoolOptimumSize {

private static int data1[] = new int[10000];
private static int data2[] = new int[20000];
private static int data3[] = new int[10000];
private static int data4[] = new int[30000];

public static void main(String ars[]) {
long startTime = System.currentTimeMillis();
int processors_count = Runtime.getRuntime().availableProcessors();
System.out.println(processors_count);
Random random = new Random();
data1 = random.ints(10000, 10, 10000).toArray();
data2 = random.ints(20000, 10, 20000).toArray();
data3 = random.ints(10000, 10, 10000).toArray();
data4 = random.ints(30000, 10, 30000).toArray();

ExecutorService executorService = Executors.newFixedThreadPool(processors_count);
executorService.execute(new Runnable() {
public void run() {
Arrays.sort(data1);
System.out.println("sorted data1:");
System.out.println(Arrays.toString(data1));
}
});

executorService.execute(new Runnable() {
public void run() {
Arrays.sort(data2);
System.out.println("sorted data2:");
System.out.println(Arrays.toString(data2));
}
});

executorService.execute(new Runnable() {
public void run() {
Arrays.sort(data3);
System.out.println("sorted data3:");
System.out.println(Arrays.toString(data3));
}
});

executorService.execute(new Runnable() {
public void run() {
Arrays.sort(data4);
System.out.println("sorted data4:");
System.out.println(Arrays.toString(data4));
}
});

executorService.shutdown();

Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
long endTime = System.currentTimeMillis();
System.out.println("Total:" + (endTime-startTime) + " ms");
}
});
}

}

最佳答案

我重复了测试并确认了您的观察结果:我只是认为执行程序服务的建立是有成本的,
我在具有8核的笔记本电脑上进行了一些进一步的测试,甚至将所有阵列增加了十倍,但我仍然得到了更快的标准版本。

再增加十倍(因此大小达到数百万),我终于使执行器变得更快。

因此,很明显,您必须处理多少数据,在某些情况下,不值得使用执行程序。 (当然,我评论了排序数组的打印输出)。

最重要的是,使用不同的数组大小会减少差异:一开始,您对4个数组进行并行排序,在1/3的时间之后,您完成了2种排序,data1和data3,并继续处理其余两个并行处理,即data2和data4,以及在一个数组上处理的最后三分之一时间,即data4。如果对相同的数组进行排序,则速度的提高将更加明显。

最后,让我补充说,测量的时间波动很大,您必须重复几次并取平均值,以获得稳定的数字并进行适当的测试。
尺寸仅为100.000s,在我的笔记本电脑上,时间波动高达50%。

关于java - 为什么在Java 8中,执行程序服务比顺序操作花费更多的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55551259/

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