[dW리뷰]믿을 만한 자바 벤치마킹
원문기사: http://www.ibm.com/developerworks/kr/library/j-benchmark1.html
JVM에서는 핫스팟이나 GC 영향으로 작은 코드 단위의 성능을 측정하기 쉽지 않은데요. 코드 블럭 단위의 마이크로벤치마크의 정확성을 높이기 위한 요령과 고려해야할 요소 등에 대해 설명하고 있습니다.
실제로 유용한건 마이크로벤치마크를 위한 프레임워크를 제공하는 파트2겠습니다만 파트1에서는 기본적인 배경설명과 핫스팟이나 GC를 감안한 성능향상 팁(흔히 생각할 수 없는) 몇가지를 소개하고 있습니다.
int result = 0;
for (int i = 0; i < 1000 * 1000; i++) { // outer loop
for (int j = 0; j < array.length; j++) { // inner loop 1
result += array[j];
}
for (int j = 0; j < array.length; j++) { // inner loop 2
result ^= array[j];
}
}
int result = 0;
for (int i = 0; i < 1000 * 1000; i++) { // sole loop
result = add(result); // inner loop 1
result = xor(result); // inner loop 2
}
위의 두 코드는 같은 일을 하는 코드이구요. main()에 바로 구현된 것이어서 단 한번씩만 실행됩니다. 보기에는 위쪽 코드가 메소드 콜을 적게하기 때문에 더 빠를 것 같은데 핫스팟 적용을 위한 스택 내 치환(OSR)으로 인해 아래쪽 코드가 성능이 최대 두배까지 빨라진다고 합니다. 제 PC에서 테스트 해보니 각각 51.752s, 34.517s로 실제로 상당한 차이가 납니다. 뭐 배치 잡이 아닌 이상 일반적인 어플리케이션에서 딱 한번 호출하는 코드를 짤 경우는 많지 않겠습니다만.. 상식대로만 생각하면 안되겠다는 걸 보여주는 케이스인듯 합니다. ^^ 그외에도 생각지 못했던 재미있는 케이스가 많이 있네요.
요즘 하는 일이 메소드 수준의 성능 최적화가 많이 필요했는데 상당한 도움이 되는 기사였습니다. 좋은 기사와 번역 감사드립니다~

