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

时间:2019-04-06 16:46:17

标签: java multithreading concurrency

在下面的程序中,我想对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");
        }
    });
}

}

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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