자바의 반복문을 사용해서 로직을 처리하는 데 대표적으로 3가지가 있다.
가장 많이 쓰는 For문, 향상된 For문, Stream-filter를 이용한 반복
반복문을 사용하면서 도움이 되고자 하는 마음에 이 글을 작성합니다.
간단하게 List 객체에 데이터를 넣어서 해당 필드의 조건이 충족하면 반복구간을 탈출하는 식으로 코드를 작성하였습니다.
import java.util.ArrayList;
import java.util.List;
// 성능비교 메인 메서드
public class CompareFunction {
//카운트 될 숫자
static final Integer count = 28888888;
//유저 정보 리스트 객체 사이즈 => 3000만개로 셋팅
static final Integer listSize = 30000000;
//리스트 객체 생성자 생성
static List<UserInfo> list = new ArrayList<>();
public static void main(String[] args) {
Long currentMs;
// list 객체에 임의로 3000만개 데이터 누적
for (int i = 0; i < listSize; i++) {
list.add(new UserInfo("json"+i,"010-xxxx-xxxx",24));
}
System.out.println("for문 시작");
currentMs = System.currentTimeMillis();
System.out.println("for문 종료 : " + (calcForLoop() - currentMs) + "ms");
System.out.println("향상된 for문 시작");
currentMs = System.currentTimeMillis();
System.out.println("향상된 for문 종료 : " + (calcEnhancedForLoop() - currentMs) + "ms");
System.out.println("stream Filter 함수 시작");
currentMs = System.currentTimeMillis();
System.out.println("stream Filter 함수 종료 : " + (calcSteamFilter() - currentMs) + "ms");
}
//for문 계산식
private static Long calcForLoop() {
Integer listSize = list.size();
for (int i = 0; i< listSize; i++) {
if (list.get(i).getName().equals("json"+count)) {
break;
}
}
return System.currentTimeMillis();
}
//향상된 for문 계산식
private static Long calcEnhancedForLoop() {
for (UserInfo userInfo: list) {
if (userInfo.getName().equals("json"+count)) {
break;
}
}
return System.currentTimeMillis();
}
//Stream의 Filter 메소드 계산식
private static Long calcSteamFilter() {
list.stream()
.filter(userInfo -> userInfo.getName().equals("json"+count))
.findAny().get().getName()
;
return System.currentTimeMillis();
}
}
//유저정보 객체
public class UserInfo {
private String name;
private String phoneNum;
private Integer age;
public UserInfo(String name, String phoneNum, Integer age) {
this.name = name;
this.phoneNum = phoneNum;
this.age = age;
}
public UserInfo() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
해당 데이터는 3000만건의 리스트 객체에 넣어두고 리스트 객체의 카운트 될 숫자를 28888888건으로 조정
=> 단순 리스트 객체를 루프 돌 때 성능 차이가 얼마나 나는 지 확인해보기 위함
결과값은 예상대로 단순 index 기반으로 루트를 돌리는 For문의 속도가 제일 빨랐다.
두번째는 향상된 For이 빨랐다.
사람마다 가독성의 기준은 다르지만 제가 느낀 바로는 가독성 측면에서 별 차이는 없어보이지만
가독성 : Stream-filter > 향상된 For문 > For문
성능 : For문 > 향상된 For문 > Stream-filter
였다.
테스트 환경은 단순 index에 대한 루프였고 상황에 따라 구조적 차이로 성능에 차이가 있을 수 있습니다.
가독성 : Stream-filter > 향상된 For문 > For문
성능 : For문 > 향상된 For문 > Stream-filter