Back/Spring Java

for문(Loop) 성능 개선 - 2

밍꿔 2020. 4. 16. 13:48


반응형

JDK5.0이전에는 대부분 아래와 같이 for문을 작성 했을 것이다.

 

for (int loop = 0; loop < list.size(); loop++)

 

위의 코드의 문제점은 loop를 돌면서 매번 list.size()메서드를 호출 하기 때문에 적절하지 못하다.

 

아래와 같이 개선한다면,

 

int listSize = list.size();
for (int loop = 0; loop < listSize; loop++)

 

list.size()메서드를 반복 호출할 필요가 없어지므로 조금 더 향상된 성능을 보여준다.

 

 

또, JDK5.0부터는 향상된for문, for-each를 사용 할 수 있다.

 

ArrayList<String> list = new ArrayList<String>();
for (String str : list)

 

 

*성능테스트

int current;
public void resultProcess(int result) {
	current = result;
}

// 첫 번째 (개선 전 일반for문)
public void traditionalSizeForLoop() {
	for (int loop = 0; loop < list.size(); loop++) {
		resultProcess(list.get(loop));
	}
}

// 두 번째 (개선 후 일반for문)
public void traditionalForLoop() {
	int listSize = list.size();
	for (int loop = 0; loop < listSize; loop++) {
		resultProcess(list.get(loop));
	}
}


// 세 번째 (for-each)
public void timeForEachLoop() {
	for (Integer loop : list) {
		resultProcess(loop);
	}
}

// 네 번째 (java8 이상)
public void timeForEachLoopJava8() {
	list.forEach(this::resultProcess);
}

 

 

* 테스트 결과

				Mode  Cnt    Score    Error  Units
ForLoop.timeForEachLoop         avgt    5  159.759 ± 97.272  us/op
ForLoop.timeForEachLoopJava8    avgt    5  108.508 ± 11.156  us/op
ForLoop.traditionalForLoop      avgt    5  117.491 ± 15.692  us/op
ForLoop.traditionalSizeForLoop  avgt    5  131.080 ± 46.861  us/op

 

 

자바8의 forEach가 가장 빠르게 나왔고 그다음은 개선된 일반for문으로 보여진다 이 둘의 차이는 매우 근소하게 보여진다. 하지만, 개선 전과 개선 후의 결과 차이는 크다고 볼 수 있다.

 

 

 

* 반복구문에서의 필요없는 반복

public void sample(DataVo data, String key) {
    TreeSet treeSet2 = null;
    treeSet2 = (TreeSet)data.get(key);
    if (treeSet2 != null) {
        for (int i=0; i< treeSet2.size(); i++) {
            DataVO2 data2 = (DataVO2)treeSet2.toArray()[i];
            ...
        }
    }
}

 

TreeSet 형태의 테이터를 갖고 있는 DataVO에서 TreeSet을 하나 추출하여 처리하는 부분인데,

이 소스의 문제는 toArray() 메서드를 반복해서 수행한다는 점 이다.

아래와 같이 toArray()메서드가 반복되지 않도록 개선한다면,

 

 

public void sample(DataVo data, String key) {
    TreeSet treeSet2 = null;
    treeSet2 = (TreeSet)data.get(key);
    if (treeSet2 != null) {
        DataVO2[] dataVO2 = (DataVO2)treeSet2.toArray();
        int treeSetSize = treeSet2.size();
        for (int i=0; i< treeSetSize; i++) {
            DataVO2 data2 = dataVO2[i];
            ...
        }
    }
}

 

첫번째 소스보다 바로 위의 두번째 소스의 성능은 좋아진다.

 

 

 

 

 

참조 : https://yangbongsoo.gitbook.io/study/undefined/for

 

 

 

반응형