본문으로 바로가기



최근 생각없이 웹서핑을 하던 중 다음과 같은 글을 발견하였다.




















해당 글 링크: http://www.tipssoft.com/bulletin/board.php?bo_table=story&wr_id=56




결과에서 몇 가지 이해할 수 없는 부분이 있어서

직접 수행속도를 평가 비교해보기로 했다.

하는김에 Iterator도 추가해서 실험해보자.


실험목표 :
1. For, While, Iterator의 속도 비교값을 산출할 것.
2. 해당 실험자와 근사한 수치의 결과값을 산출할 것.







실험을 위해 아래와 같이 정수를 담을 ArrayList를 선언한다. 

이때, test_data를 메모리에 올려두어서,

클래스 내의 모든 곳에서 사용할 수 있도록

public class WhichLoopIsFaster 의 필드에 전역변수(멤버변수)로 둔다.

public static ArrayList<Integer> test_data = InputTestData();


InputTestData() 메소드로 1500만 개의 숫자를 ArrayList에 담는다.

public static ArrayList<Integer> InputTestData() {
ArrayList arr = new ArrayList();
        for (int i = 0; i < 15000000; i++) {
        	arr.add(i);
        }
        return arr;
}


For문 수행 경과 시간을 체크하는 메소드를 만든다.

public void For() {
        System.out.println("\n--- For ---\n");

Date().getTime()는 프로그램이 순차적으로 실행되면서 자신을 호출하기까지 시간이 얼마나 경과했는지를 알려주는 메소드이다.
        long startTime = new Date().getTime();
        int i;

ArrayList 에 담긴 데이터의 크기만큼 For문을 실행한다.

이 때 int v 는 단순히 한번씩 ArrayList의 값들이 저장되는 변수에 불과하다. (시간 떼우기용)    

for (i = 0; i < test_data.size(); i++) int v = test_data.get(i);


위와 마찬가지로 수행시간을 알기 위해 Date().getTime() 메소드를 호출한다.
        long endTime = new Date().getTime();


종료 시간에서 시작 시간을 빼서 순수하게 for문이 수행된 시간만을 추려낸다.

long elapsed = endTime - startTime; System.out.println("For :: 걸린 시간은 "+elapsed+ " 밀리초" );


While 문은 For문과 동일하게 처리하였으므로 생략.

이제 Iterator 수행 경과 시간을 체크하는 메소드를 만들자.

public void Iterator() { System.out.println("\n--- Iterator Loop ---\n"); long startTime = new Date().getTime(); }


Iterator는 인터페이스이므로 정수를 담는 제네릭을 사용하여 선언한다.

Iterator<Integer> itr;


ArrayList의 모든 내용이 한번씩 돌때까지 반복하는 for문을 작성한다.
Iterator 인터페이스를 가져와 구현하는 클래스의 인스턴스를 반환하는 과정을 for 문으로 반복한다.

for(itr = test_data.iterator();itr.hasNext();) { test_data.get(itr.next()); long endTime = new Date().getTime(); long elapsed = endTime - startTime; System.out.println("Iterator :: 걸린 시간은 "+elapsed+ " 밀리초");


1500만 건의 데이터를 처리하는데에 소요된 시간은 다음과 같다. (3차례 수행)








For문과 While문의 수행속도는 거의 유의미하며, 

Iterator의 경우 어느정도 예상은 했으나 아무래도 객체를 가져오는 과정이 있다보니 오래 걸리는 듯하다.


하지만 느리다고

Iterator 사용을 무조건 기피하지 말고,

Iterator의 장점인 Index를 관리해준다는 강력한 편의성을 살릴 수 있을 경우

적절하게 사용하면 좋을 것 같다.


어셈블리로 실험한 글의 필자와 유사한 결과가 나왔으므로

실험은 1차 종료



※ 아래 코드는 전체 코드입니다.

/*
 *  Writer : 3Colored
 *  Date : 2019-03-12 Tue
 *  Blog : https://3colored.tistory.com
 *  Email : find1086@gmail.com
 *  
 *  Subject : Evaluating execution speed of each Loops
 *                  While / For / Iterator      
*/
package tistory;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;

public class WhichLoopIsFaster {

public static ArrayList<Integer> test_data = InputTestData();
public static void main(String[] args) {
	    	
		WhichLoopIsFaster evaluate = new WhichLoopIsFaster();

	    	evaluate.For();
	    	evaluate.While();
	    	evaluate.Iterator();
	}

    public void For() {
        System.out.println("\n--- For ---\n");
        long startTime = new Date().getTime();
        int i;
        for (i = 0; i < test_data.size(); i++) {
        	int v = test_data.get(i);
        }
        long endTime = new Date().getTime();
        long elapsed = endTime - startTime;
        System.out.println("For :: 걸린 시간은 "+elapsed+ " 밀리초" );
    }

    public void While() {
        System.out.println("\n--- While Loop ---\n");
        long startTime = new Date().getTime();

        int i = 0;
        while (i < test_data.size()) {
            int v = test_data.get(i);
            i++;
        }
        long endTime = new Date().getTime();
        long elapsed = endTime - startTime;
        System.out.println("While :: 걸린 시간은 "+elapsed+ " 밀리초" );
    }

    public void Iterator() {
        System.out.println("\n--- Iterator Loop ---\n");
        long startTime = new Date().getTime();
        
        Iterator<Integer> itr;
        for(itr = test_data.iterator();itr.hasNext();) {
        	test_data.get(itr.next());
        }
        
        long endTime = new Date().getTime();
        long elapsed = endTime - startTime;
        System.out.println("Iterator :: 걸린 시간은 "+elapsed+ " 밀리초");
    }

    public static ArrayList<Integer> InputTestData() {
        ArrayList<Integer> arr = new ArrayList<Integer>();
        for (int i = 0; i < 15000000; i++) {
        	arr.add(i);
        }
        return arr;
    }

	
}





'Algorithm > 기타 정보' 카테고리의 다른 글

[java] Stack 구현  (0) 2019.06.26
2중 반복문 속도 비교 (WhileFor vs. ForFor)  (0) 2019.03.31
반복문 비교 (2)  (0) 2019.03.15