[Java]반복문 성능비교(For문, 향상된For문, Stream-filter)

김승원·2022년 7월 19일
0

자바의 반복문을 사용해서 로직을 처리하는 데 대표적으로 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

profile
Over shoes, over boots

0개의 댓글