느린 것을 걱정하지 말고, 멈춰서는 것을 걱정하라
article thumbnail
Published 2022. 1. 25. 20:16
i = i + 1, i++ 의 차이 IT/JAVA

재밌는 문제가 있었다. 관련하여 리서치 및 테스트를 조금 해봐서 적게된다.

 

문제의 요지는 for문에서 3번째로 오는 증감연산자에서 i = i + 1을 사용하는 것보다 i++를 사용하는게 성능의 이점이 있다는 말이다. 

 

리서치를 해본 결과, i++ 연산의 경우에는 다음과 같이 바이트 코드로 컴파일 된다고 한다.

IINC 1 1

 

그리고 i = i + 1 연산의 경우는 다음과 같은 형의 바이트 코드로 컴파일 된다고 한다.

ILOAD 1
ICONST_1
IADD
ISTORE 1

결론적으로 i++쪽의 바이코드가 더 적은 연산을 수행한다. i++의 경우 1번인덱스의 값을 1 증가시키는 바이트 코드이고

i = i + 1의 경우 1번 인덱스의 값을 스택에 넣고 상수 1을 스택에 넣고 이 둘을 더해서 1번 인덱스에 저장하는 방식이라고 한다.

 

적은 연산을 수행한 i++연산이 i=i+1 연산보다 적은 시간을 소모할 것이다라는 것을 증명하기 위해 아래와 같이 Integer.MAX_VALUE만큼의 for문을 돌리는 테스트 코드를 1000번 수행하도록 작성하였다.

public class PlusTest
{
    @Test
    @RepeatedTest(1000)
    void test1()
    {
        long test1start = System.nanoTime();
        for (int i = 0; i < Integer.MAX_VALUE; i = i + 1)
        {

        }
        long test1end = System.nanoTime();
        long diff1 = test1end - test1start;


        long test2start = System.nanoTime();
        for (int i = 0; i < Integer.MAX_VALUE; i++)
        {

        }
        long test2end = System.nanoTime();
        long diff2 = test2end - test2start;

        assertThat(diff1 - diff2).isGreaterThan(0);
    }
}

가설대로라면 1000번 모두 diff1(i = i + 1 수행시간)이 diff2 (i++ 연산 수행시간)보다 클 것이다. 

 

1000번 돌려본 결과 예상과 다르게 446번의 테스트가 i = i +1이  i++보다 시간이 더 걸렸고 그 외에는 같거나 미세한 차이로 i = i + 1이 빨랐다.  

 

 

 

상식적으로 for문을 Integer.MAX_VALUE만큼 돌리면 명령어가 4개인 i = i + 1이 더 느릴거라 생각했는데 i++가 느린 경우도 있는건 의외의 결과였다. 

 

profile

느린 것을 걱정하지 말고, 멈춰서는 것을 걱정하라

@주현태

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!