Java에서 1.8로 넘어가면서 stream을 활용한 반복문 활용이 많아졌다.
그러다 성능이 떨어지고 속도가 느리다라는 글을 자주 보게되어서 얼마나 차이가나는지 궁금해졌다.
stream을 활용하게 되면 데이터를 편리하게 가공 할 수 있다는 점이 무척 맘에 들었었는데..
사실 성능은 요즘 서버나 개발컴퓨터들이 좋으니 신경쓰지 않았었다.
그런데 느리다는 점이 얼마나 차이가 나는지 단순하게 확인을 해 보았다.
일단 for 를 활용한 기본 반복문, Iterator를 활용한 반복문(for, while), 향상된 for문을 활용한 반복문 그리고 마지막으로 stream을 활용한 반복문 총 5가지 방법으로 테스트를 해 보았다.
당연히 Java는 1.8로 설치 하였다.
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class TestLoopSpeed {
private static final List<String> RESULT = new LinkedList<String>();
public static void main(String[] args) {
final List<String> list = new LinkedList<String>();
for(int i = 0 ; i < 200000; i++){
list.add(""+i);
}
timeChecker("일반 반복문 스타일",()->{
for(int i = 0 ; i < list.size(); i++){
String adder = new String(list.get(i));
int aa = Integer.parseInt(adder);
adder = null;
}
});
timeChecker("Iterator for 스타일",()->{
for (Iterator<String> iter = list.iterator(); iter.hasNext(); ) {
String adder = new String(iter.next());
int aa = Integer.parseInt(adder);
adder = null;
}
});
timeChecker("Iterator while 스타일",()->{
final Iterator<String> iter = list.iterator();
while (iter.hasNext() ) {
String adder = new String(iter.next());
int aa = Integer.parseInt(adder);
adder = null;
}
});
timeChecker("ForEach 스타일",()->{
for(String prt : list){
String adder = new String(prt);
int aa = Integer.parseInt(adder);
adder = null;
}
});
timeChecker("Straem 활용",()->{
list.stream().forEach((prt)->{
String adder = new String(prt);
int aa = Integer.parseInt(adder);
adder = null;
});
});
System.out.println(" - 결과 - ");
RESULT.stream().forEach(System.out::println);
}
//시간 기록용 메소드
public static void timeChecker(String name, Todo todo){
long beforeTime = System.currentTimeMillis();
todo.todo();
long afterTime = System.currentTimeMillis();
long secDiffTime = (afterTime - beforeTime);
RESULT.add(name + " 시간차이(m) : "+secDiffTime);
try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }
}
//콜백용 인터페이스
public interface Todo{
public void todo();
}
}
전역객체인 RESULT에 시간을 기록하게 하였고, 연결리스트를 활용해서 데이터를 20만개 넣었다.
연결리스트를 사용한 이유는 반복문이 동작 할 때 조금 힘들게(?) 하기 위해서 사용 하였다.
일단 여러번(10회정도) 동작시킨 결과이다.
시간차이는 첫번째 반복문에서만 조금 발생하였으며 나머지 아래 반복문은 0초가 걸려서 사실상 즉시실행된 느낌 이였다.
stream을 활용한 결과가 느리다(?)라는 내용은 체감되지가 않았다.
첫번째 반복문이 너무느려 빼버린 뒤에 연결리스트에 데이터 수를 10배로 하고선 여러번 측정하여 보았다.
성능상의 차이는 존재한다는 것은 반복문을 동작시킬 때 에러를 내 보면 에러 메시지 수를 통해 알 수 있다.
그러나 시간차이는 거의 차이가 없었던 것 같다.
아무튼, 성능에서의 차이는 존재한다고는 생각하는데 속도에서 차이는 크지 않는 것 같다.
'Java(자바)' 카테고리의 다른 글
Java Jsch를 활용하여 파일 다운로드(Jsch sftp, Jsch download file) (0) | 2019.10.23 |
---|---|
테스트용 SSL 톰캣 적용기 (SSL Tomcat, OpenSSL) (12) | 2019.10.14 |
자바 Soap 클라이언트 간단하게 구현하기 (0) | 2019.09.02 |
JAVA List 중복제거, distinct (stream과 Function을 활용) (0) | 2019.08.06 |
Java Files 클래스를 통한 파일 읽기(lines, read, newBufferedReader, readAllLines) (0) | 2019.07.25 |
댓글