본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Java(자바)

JAVA 반복문 속도 테스트(Java loop speed test, Java stream 속도)

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2019. 9. 20.

 

 

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배로 하고선 여러번 측정하여 보았다.

 

시간차이는 그다지 나지 않았다.

 

성능상의 차이는 존재한다는 것은 반복문을 동작시킬 때 에러를 내 보면 에러 메시지 수를 통해 알 수 있다.

그러나 시간차이는 거의 차이가 없었던 것 같다.

아무튼, 성능에서의 차이는 존재한다고는 생각하는데 속도에서 차이는 크지 않는 것 같다.

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글