2022년 10월 31일 월요일, 저는 백엔드 이프와 함께 자바를 학습하고 있었습니다. 그러던 중 이프가 흥미로운 주제를 던졌습니다. Final 키워드가 실제로 성능이 향상된다는 점이었습니다.

처음 들었을 때는, 말도 안되는 소리라고 생각했지만.. 학습해 보니 성능이 향상될 수도 있다는 점을 알게 되었습니다.

 

우선, Final 키워드를 붙인 코드입니다.

@Test
public void sum1() {
    long start = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
        final String a = "a";
        final String b = "b";

        String c = a + b;
    }
    long end = System.currentTimeMillis();

    System.out.println(end - start);
}

 

다음으로, Final 키워드를 붙이지 않은 코드입니다. 동일한 코드를 사용하며 정말 final 키워드만 빼두었습니다.

@Test
void test2() {
    long start = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
        String a = "a";
        String b = "b";

        String c = a + b;
    }
    long end = System.currentTimeMillis();

    System.out.println(end - start);
}

생각보다 위 코드의 경우는 성능 차이가 나타나는 것을 볼 수 있습니다. 그렇다면 왜 이런 결과가 나타났을까요? 컴파일 시 최적화가 일어나기 때문입니다. 실제로 생성된 바이트코드를 살펴보겠습니다.

 

우선 Final 키워드를 사용한 코드의 바이트코드를 살펴보겠습니다.

예상은 + 연산을 해줄 것이라고 생각했지만, 실제 결과는 따로 연산을 수행하는 것이 아닌 “a”와 “b”가 더해진 결과인 “ab”를 곧바로 넣어줍니다.

 

다음으로, Final 키워드를 사용하지 않은 코드의 바이트코드를 살펴보겠습니다.

Final 키워드를 사용하지 않으니 우리가 생각한 결과인 a와 b를 불러오고, a와 b를 makeConcatWithConstants 메서드를 통해 더해주는 모습을 볼 수 있었습니다.

 

결론

즉, 결론적으로 모든 경우에서 무조건 성능이 좋아진다고 보기는 어렵지만, 위와 같은 경우 Final 키워드를 사용하니 컴파일러가 최적화 해주는 모습을 볼 수 있었습니다.

 

Reference


https://stackoverflow.com/questions/4279420/does-use-of-final-keyword-in-java-improve-the-performance

'Language > Java' 카테고리의 다른 글

Java의 동시성 제어  (0) 2022.11.10
Collection 얕게 알아보기 (1)  (0) 2022.11.08
JVM의 동작원리  (0) 2022.10.22
lambda 예외 핸들링  (0) 2022.10.02
[ Junit ] 랜덤 데이터 테스트  (0) 2022.02.10

+ Recent posts