반응형
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
반응형
'Back > Spring Java' 카테고리의 다른 글
Spring 필드주입(@Autowired)보다 생성자주입을 권장하는 이유 (0) | 2020.05.25 |
---|---|
@Async 비동기 호출 (0) | 2020.04.27 |
for문(Loop) 성능 개선 - 1 (0) | 2020.04.13 |
File객체를 이용한 파일삭제 (0) | 2020.04.01 |
OutputStream를 이용한 파일생성 (0) | 2020.04.01 |