String 을 Array 로 변환할 때 효율

알파로그·2023년 3월 16일
0

JAVA 문법과 지식

목록 보기
6/9
post-custom-banner

✏️ 발단

알고리즘 테스트 리뷰를 하던중

String 의 index 를 배열로 바꿀 때 어떤 방법이 효율이 좋을지 궁금증이 생겼다.


✏️ 실험 방법

효율성을 테스트하기위해서 System.*nanoTime*() 를 이용했다.

📍 System.nanoTime 사용법

시간 측정을 원하는 로직의 앞 뒤로 선언해준 뒤,

두 변수의 값의 차이를 비교해 확인하면 된다.

        //-- 측정 준비 과정 --//
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 999999; i++) 
            sb.append("a");
        
        String str = sb.toString();

        //-- 측정 과정 --//
        long start = System.nanoTime(); // 측정 시작

        String[] split = str.split(""); // 측정하려는 로직

        long end = System.nanoTime(); // 측정 종료

        //-- 측정 결과 계산 과정 --//
        double runningTime = (end - start) / 1000000.0;
        System.out.println(runningTime);

📍 before each

측정 준비하기 위해 중복되는 코드를 제거하기 위해

측정 준비 과정은 별도의 method 로 분리했다.

    private static String beforeEach() {

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < 999999; i++)
            sb.append("a");

        return sb.toString();
    }

✏️ 실험 시작

📍 split

splite 에 빈 문자열을 넣어 String 배열로 바꾸는 방식이다.

신기하게 같은 로직인데도 돌릴 때 마다 시간 차이가 있었다.


평균적으로 100 ~ 120 정도 시간이 걸렸다.

단위는 1,000,000,000초 / 1000000.0 이다…

    @Test
    void split() {
        String str = beforeEach();
        long start = System.nanoTime();

        String[] split = str.split("");

        long end = System.nanoTime();

        double runningTime = (end - start) / 1000000.0;
        System.out.println(runningTime);  // 100 - 120
    }

📍 toCharArray

String 의 글자를 char 로 변환해 array 로 바꿔주는 라이브러리이다.


결과는 0 ~ 3 정도로 대부분 0. 대가 나오고 가끔 2. 대가 나왔다.

split 와 비교했을때 최대 100 배 이상 차이가 나서 놀랐다.

    @Test
    void charArray() {
        String str = beforeEach();
        long start = System.nanoTime();

        char[] chars = str.toCharArray();

        long end = System.nanoTime();
        double runningTime = (end - start) / 1000000.0;
        System.out.println(runningTime); // 0 ~ 3
    }

📍 for loop

마지막으로 단순히 char 배열을 선언 후 for 문을 통해 값을 넣어주는 방식도 실험해 봤다.

알고리즘 문제를 풀때 라이브러리를 적게 쓰는 코드가 대부분 좋은 효율이 좋았었던 것 같아서 확인 해봤다.


결과는 9 ~ 10 정도로 toCharArray 보다 약 3배에서 10 배 정도 차이가 났지만,

split 에 비해선 압도적으로 빠른 결과가 나왔다.

    @Test
    void forLoop() {
        String str = beforeEach();
        long start = System.nanoTime();

        char[] arr = new char[str.length()];

        for (int i = 0; i < str.length(); i++) {
            arr[i] = str.charAt(i);
        }

        long end = System.nanoTime();
        double runningTime = (end - start) / 1000000.0;
        System.out.println(runningTime); // 9 ~ 10
    }

✏️ 결론

toCharArray > for 문 >>>> split

profile
잘못된 내용 PR 환영
post-custom-banner

0개의 댓글