私はJava 8並列ストリームについて学んでいます。私は最初にExecutorを使ってコードを書いた後、並列ストリームを使っています。 Executorのアプローチ(5秒)と並行して2倍(10秒)の時間がかかるようです。私の意見では、パラレルストリームも同様のパフォーマンスを示す必要があります。なぜ並列ストリームは2倍の時間を要するか? 私のコンピュータは8つのコアを持っています。java 8並列ストリームにはさらに時間がかかります
/**
*
*/
package com.shashank.java8.parallel_stream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* @author pooja
*
*/
public class Sample {
public static int processUrl(String url) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Running Thread " + Thread.currentThread());
return url.length();
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
usingExecutor();
usingParallelStream();
}
public static void usingParallelStream() {
Date start = new Date();
// TODO Auto-generated method stub
int total = buildUrlsList().parallelStream().mapToInt(Sample::processUrl).reduce(0, Integer::sum);
Date end = new Date();
System.out.println(total);
System.out.println((end.getTime() - start.getTime())/1000);
}
public static void usingExecutor() throws Exception {
Date start = new Date();
ExecutorService executorService = Executors.newFixedThreadPool(100);
List<Future> futures = new ArrayList<>();
for (String url : buildUrlsList()) {
futures.add(executorService.submit(() -> processUrl(url)));
}
// iterate through the future
int total = 0;
for (Future<Integer> future : futures) {
total += future.get();
}
System.out.println(total);
Date end = new Date();
System.out.println((end.getTime() - start.getTime())/1000);
}
public static List<String> buildUrlsList() {
return Arrays.asList("url1", "url2", "url3", "url4", "url5", "url6", "url7", "url8", "url9");
}
}
異なるプロセスに情報を移動する時間がボトルネックになる可能性があります。あなたはフランスの食べ物を手に入れるためにフランスまでずっと飛んでいってはいけません。データをコピーするのに多くの時間を費やし、実際の作業には時間がかかりません。 –
さて、それはあなたのベンチマークとあなたのベンチマークについてです。ここを見てください:http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java。 – Eugene
さらに、 'Sample :: processUrl'が何をしているのかわからないので、本当に助けにならないでしょう。しかし、8コアマシンで100スレッドの 'ExecutorSerivce'がまったくうまくいかないことは明らかです。 – Eugene