본문 바로가기



프로그래밍/JAVA

[JAVA] for 문과 While의 성능차이

코드를 작성하다보니 for문과 while문의 성능차이가 궁금해져서 검색해봤는데. 아주 큰 프로젝트가 아니라면 그렇게 차이 있지는 않다는 답변이 많았고, 언어에 따라 컴파일러 의존적이라는 이야기가 많았으며, 특히 최적화 잘된 컴파일러라면 동일한 내용을 가지고 있다고 했다. C나 C++이라면, 디어셈블 해야겠지만 자바는 처음부터 내장된 javap 라는 프로그램을 이용해서 바이트 코드를 얻어 낼 수 있다. 

int 연산으로 직접 속도 측정을 해보니 서로 매번 엎치락 뒤치락하는 결과

 먼저 자바에서 제공하는 기능을 이용해서 측정해보았는데 그 차이가 아주 근소했다. 실행시마다 매번 다른 결과를 보여주었다.  코드가 복잡하면 이해하기 어려우므로 간단한 코드를  새로 작성해서   바이트코드를  열어보기로 했다.

일단 이클립스에서 1부터 10까지 더하는 코드를 각각 for문과 while 문으로 작성해놓았다.

public class exam_run_forByteCode {

	public static void main(String[] args) {
		int i = 0 ;
		int sum = 0 ;
		
		for ( i= 0; i<=10; i++) {
			sum+= i;
		}
		System.out.println(sum);
	}

}

for 문을 사용한 1부터 10까지 덧셈 코드 

public class exam_run_whileByteCode {

	public static void main(String[] args) {
		int i = 0;
		int sum = 0;
		
		while (i<=10) {
			sum+= i;
			i++;
		}
		System.out.println(sum);
	}

}

 whlie 문을 이용한 1부터 10까지 덧셈코드 

테스트를 위해 최대한 비슷하게 작성한후에 한번 실행

해당 프로젝트 디렉토리에서 각 class 파일을 다음과 같이 바이트 코드로 추출하여 txt파일로 저장하였다.

비교를 위해 notepad ++ 의 compare기능을 이용했다.

for 문에서 iconst_0 [ load the int value 0 onto the stack] , istore_1[store a long value in a local variable 0] 두줄이 더 있는것 이외에는 거의 동일한 코드가 생성된것을 볼 수 있다.