Java 8 스트림 적용시 성능 변화

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() 메소드만 호출하면 가능합니다.

Share