for 문
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int startIndex = 0; long endIndex = 2000000000L;
long startTime = System.currentTimeMillis();
long sum = 0; for (long i = startIndex; i < endIndex; i++) { sum += i; }
long processTime = System.currentTimeMillis() - startTime;
System.out.println("sum : " + sum); System.out.println("process time : " + processTime + "ms");
|
실행 결과입니다.
1 2
| sum : 1999999999000000000 process time : 11919ms
|
Stream 사용
1 2 3 4 5 6 7 8 9 10
| int startIndex = 0; long endIndex = 2000000000L;
long startTime = System.currentTimeMillis();
long sum = LongStream.range(startIndex, endIndex).sum();
long processTime = System.currentTimeMillis() - startTime; System.out.println("sum : " + sum); System.out.println("process time : " + processTime + "ms");
|
실행 결과입니다.
1 2
| sum : 1999999999000000000 process time : 33446ms
|
parallel 사용
1 2 3 4 5 6 7 8 9 10
| int startIndex = 0; long endIndex = 2000000000L;
long startTime = System.currentTimeMillis();
long sum = LongStream.range(startIndex, endIndex).parallel().sum();
long processTime = System.currentTimeMillis() - startTime; System.out.println("sum : " + sum); System.out.println("process time : " + processTime + "ms");
|
실행 결과입니다.
1 2
| sum : 1999999999000000000 process time : 9407ms
|
결과
기존 for 문으로 구현한 방식을 자바의 stream 형태로 변경했을 때 성능은 저하되나 병렬 처리를 사용하면 성능 향상을 할 수 있습니다.
for 문은 병렬 처리를 하려면 여러 스레드에 공유 자원에 대한 접근을 고려하여 구현해야 하기 때문에 쉽지 않은데 자바의 stream을 사용할 경우 병렬 처리로 변경하는 과장이 parallel()
메소드만 호출하면 가능합니다.