Java8 병렬처리 프로그램 성능분석
- 단순계산을 parallel 프로그래밍 하면 오히려 더 느려짐.(아래 코드에서 peek() 부분을 빼고 실행해보면 됨)
public class ParallelPerformanceExcamples1 {
public static void main(String[] args) {
// final long n = 10_000_000;
final long n = 1000;
// System.out.println((1+n)*(n/2)); //가우스 수식
final long start1 = System.currentTimeMillis();
System.out.println("iterativeSum:" + iterativeSum(n));
System.out.println("elapsed " + (System.currentTimeMillis()-start1) + " ms.\n");
final long start2 = System.currentTimeMillis();
System.out.println("sequentialSum:" + sequentialSum(n));
System.out.println("elapsed " + (System.currentTimeMillis()-start2) + " ms.\n");
final long start3 = System.currentTimeMillis();
System.out.println("parallelSum:" + parallelSum(n));
System.out.println("elapsed " + (System.currentTimeMillis()-start3) + " ms.\n");
final long start4 = System.currentTimeMillis();
System.out.println("rangedSum:" + rangedSum(n));
System.out.println("elapsed " + (System.currentTimeMillis()-start4) + " ms.\n");
final long start5 = System.currentTimeMillis();
System.out.println("parallelRangedSum:" + parallelRangedSum(n));
System.out.println("elapsed " + (System.currentTimeMillis()-start5) + " ms.\n");
}
public static long iterativeSum(long n){
long result = 0;
for(long i = 0; i <= n; i++){
result += i;
slowDown();
}
return result;
}
public static long sequentialSum(long n){
return Stream.iterate(1L, i -> i + 1).limit(n).peek(i->slowDown()).reduce(Long::sum).get();
}
public static long parallelSum(long n){
//단순계산은 parallel처리 시 더 오래 걸림.
//reduce는 초기값이 필요한데 병렬처리 시 초기값을 알 수 있을 때가지 기다려야 하므로 더 느려짐.
return Stream.iterate(1L, i -> i + 1).limit(n).parallel().peek(i->slowDown()).reduce(Long::sum).get();
}
public static long rangedSum(long n){
return LongStream.rangeClosed(1, n).peek(i->slowDown()).reduce(Long::sum).getAsLong();
}
public static long parallelRangedSum(long n){
return LongStream.rangeClosed(1, n).parallel().peek(i->slowDown()).reduce(Long::sum).getAsLong();
}
public static void slowDown(){
try {
TimeUnit.MILLISECONDS.sleep(10L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
위 결과.
iterativeSum:500500
elapsed 10082 ms.
sequentialSum:500500
elapsed 10209 ms.
parallelSum:500500
elapsed 2521 ms.
rangedSum:500500
elapsed 10033 ms.
parallelRangedSum:500500
elapsed 2535 ms.