재밌는 문제가 있었다. 관련하여 리서치 및 테스트를 조금 해봐서 적게된다.
문제의 요지는 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++가 느린 경우도 있는건 의외의 결과였다.
'IT > JAVA' 카테고리의 다른 글
Cookie는 왜쓰는가? 그리고 Cookie관련 간단한 자바 예제 (0) | 2022.03.06 |
---|---|
Equals를 재정의할때 반드시 hashCode를 재정의 해야한다. (0) | 2022.02.13 |
Java 람다 표현식, 람다 함수란? (0) | 2019.12.25 |
이클립스(Eclipse) 거의 모든 단축키 모음 (0) | 2019.12.24 |
JAVA enum 자료형(직관적인 코드와 상수를 옳게 사용하기 위한) (0) | 2019.11.27 |