ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 마이크로벤치마크란? [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)에서는 본격적으로 성능을 측정한다.

     

    댓글

Designed by Tistory.