-
마이크로벤치마크란? [JAVA]카테고리 없음 2024. 7. 19. 00:02
마이크로벤치마크는 매우 작은 단위의 성능을 측정하도록 설계된 테스트다.
ex1) Test Code
public void doTest() { double l; long then = System.currentTimeMillis(); for (int i = 0; i < nLoops; i++) { l = fibImpl1(50); // 피보나치 수 구함 } long now = System.currentTimeMillis(); System.out.println("Elapsed time: " + (now - then); }
ex1의 코드는 마이크로벤치마크 테스트 코드로써 적절 하지 않다.
마이크로벤치마크를 작성할때는 프로그램 상태를 변경해줄 필요가 있다.
그렇지 않다면 똑똑한 컴파일러는 50개의 피보나치 수를 계산하는 동작 한 가지만을 여러번 수행한다는 것을 알아차리고 더 이상 반복하지 않는다.
public void doTest() { long then = System.currentTimeMillis(); long now = System.currentTimeMillis(); System.out.println("Elapsed time: " + (now - then); }
따라서 결국엔 이와 같은 코드를 실행하게 된다.
해결방안 - 피보나치수를 계산할 숫자를 각기 다르게 해준다, 그리고 volatile을 이용해 계산된 모든값을 읽어온다
for (int i = 0; i < nLoops; i++) { l = fibImpl1(random.nextInteger()); }
이경우에는 테스트 시간에 임의의 숫자를 선정하는 시간도 포함되게 될것이니 수정해주어야한다.
public class FibonacciTest { private volatile double l; private int nLoops; private int[] input; public static void main(String[] args) { FibonacciTest ft = new FibonacciTest(30); ft.doTest(true); ft.doTest(false); } private FibonacciTest(int n) { nLoops = n; input = new int[nLoops]; Random r = new Random(); for (int i = 0; i < nLoops; i++) { input[i] - r.nextInt(100); } private void doTest(boolean isWarmup) { long then = System.currentTimeMillis(); for (int i = 0; i < nLoops; i++) { l = fibImpl1(input[i]); } if (!isWarmup) { long now = System.currentTimeMillis(); System.out.println("Elapsed time: " + (now - then)); } } }
이처럼 test를 하기 전에 임의의 숫자를 다 선정 해준다.
이 코드를 보면 왜 test를 두번하지? 라고 생각이 들것이다.
그 이유는 준비 기간이 필요하기 때문이다.
자바의 특성 중 하나로는 많이 실행할수록 코드가 더 잘 수행된다는 것이 있다. 따라서 doTest(true)에서는 예열을 하고 doTest(false)에서는 본격적으로 성능을 측정한다.