在下面的程序中,我想对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");
}
});
}
}
答案 0 :(得分:2)
我重复了您的测试并确认了您的观察结果:我只是认为设置执行器服务需要付费, 我在具有8核的笔记本电脑上进行了一些进一步的测试,甚至将所有阵列增加了十倍,我仍然得到了标准版更快。
再增加10倍(因此大小大约为数百万),我终于使执行器变得更快。
因此,很显然,您必须处理多少数据,在某些情况下,不值得使用执行程序。 (当然,我评论了排序数组的打印输出。)
最重要的是,使用不同的数组大小会减少差异:一开始,您对4个数组进行并行排序,在1/3的时间之后,您完成了2种排序,data1和data3,然后继续可以并行处理另外两个数据data2和data4,最后一个时间的三分之一要处理一个数组data4。如果对相同的数组进行排序,则速度的提高将更加明显。
最后我要补充一点,测得的时间波动很大,您必须重复几次并取平均值才能得到稳定的数字并进行适当的测试。 尺寸仅为100.000s,在笔记本电脑上的时间波动高达50%。