【发布时间】:2016-01-13 02:58:21
【问题描述】:
我现在正在使用 Java 中的并行执行。昨天我尝试测量执行时间并得到一些不清楚的结果。
任务:使用并行模式和顺序求和数组。这是我的并行代码:
public static int sumArrayParallel(int[] numbers) throws ExecutionException, InterruptedException {
int cpus = Runtime.getRuntime().availableProcessors();
ExecutorService service = Executors.newFixedThreadPool(cpus);
List<FutureTask<Integer>> tasks = new ArrayList<>();
int blockSize = (numbers.length + cpus - 1) / cpus;
for (int i = 0; i < numbers.length; i++) {
final int start = blockSize * i;
final int end = Math.min(blockSize * ( i + 1 ), numbers.length);
FutureTask<Integer> futureTask = new FutureTask<Integer>(new Callable<Integer>() {
public Integer call() {
int sub = 0;
for (int j = start; j < end; j++)
sub += numbers[j];
return sub;
}
});
tasks.add(futureTask);
service.execute(futureTask);
}
int sum = 0;
for(Future<Integer> task: tasks)
sum += task.get();
service.shutdown();
return sum;
}
对于顺序来说非常简单:
public static int sumArraySequential(int[] arr) {
int sum = 0;
for( int num : arr ) {
sum += num;
}
return sum;
};
所以,顺序函数的工作速度比并行函数快 2-4 倍。我做错了什么?
【问题讨论】:
-
为什么你认为并行总是更快?也发布您系统的硬件/CPU 详细信息。
-
输入大小是多少?
-
也许,并行代码中的所有这些初始设置比执行这个简单循环的成本要高得多,它可以在 CPU 上以极快的速度执行。
-
最终的 int[] 数字,对吧?
-
@Leo 在 Java 8 中你不必explicitly declare final