공룡호가 사는 세상 이야기

포스팅을 해 놓고 비공개로 설정된 것을 몰랐다니...-_- 어쨌든 이달 마지막 리뷰.
간단한 이야기를 하나 해 보자.

'갑' 기업의 새로운 업무 프로세스를 '을'기업에서 저렴한 비용으로 개발을 하게 되었다.
많은 회의 끝에 시스템이 도입되었고, 해당 시스템 위에서 6개월간 개발되었다.
6개월 후, 프로그램 테스트에서 결함이 발견되었다. 다름아닌 '성능'이었다.
개발의 완료단계에서 '성능'이 이슈가 되어 '을'은 굉장히 당황스러웠다.
결국은 시스템의 하드웨어를 증설하여 성능 문제를 어느정도 개선시킬 수 밖에 없게 되었다.

이러한 사례를 가끔 보게되는데, 요즘같은 고성능 하드웨어 시대에서 조차 프로그램 성능을 고려하지 않을 수는 없다. dW에서 자바코드 벤치마킹을 두 편에 걸쳐 연재하게 되었는데, 그 첫번째가 번역되었다.

Listing 1. 성능 수수께끼

protected static int global;

public static void main(String[] args) {
    long t1 = System.nanoTime();

    int value = 0;
    for (int i = 0; i < 100 * 1000 * 1000; i++) {
        value = calculate(value);
    }

    long t2 = System.nanoTime();
    System.out.println("Execution time: " + ((t2 - t1) * 1e-6) + " milliseconds");
}

protected static int calculate(int arg) {
    //L1: assert (arg >= 0) : "should be positive";
    //L2: if (arg < 0) throw new IllegalArgumentException("arg = " + arg + " < 0");

    global = arg * 6;
    global += 3;
    global /= 2;
    return arg + 2;
}


 다음 중 어느 버전의 실행 속도가 가장 빠를까?

  1. 코드를 그대로 둔다(calculatearg를 테스트하지 않음).
  2. L1만 코멘트를 해제하지만 조건 확인(assertion)은 비활성화하여 실행(JVM 옵션 중 -disableassertions 사용. 이는 JVM의 기본 동작임)
  3. L1만 코멘트를 해제하지만 조건 확인은 활성화하여 실행(JVM 옵션 중 -enableassertions 사용)
  4. L2만 코멘트를 해제한다.

적어도 테스트를 전혀 하지 않는 A가 가장 빠를 것이라고 짐작할 것이다. 그리고 좋은 동적 최적화 컴파일러가 죽은 코드인 L1은 제거할 것이므로, 조건 확인을 끈 B쪽이 A에 근접한 성능을 보일 것이라 짐작하리라. 그렇지 않은가? 불행히도 이러한 짐작은 틀렸다. 위의 코드는 Cliff Click이 2002 자바원(JavaOne)에서 소개한 것을 수정하였다. 그가 발표한 실행 시간은 다음과 같다.

놀라운 결과와 다양한 이슈들은 아래 링크에서 확인하자.
링크 : http://www.ibm.com/developerworks/kr/library/j-benchmark1.html#listing1

마음이 급하여 Part 2의 원문을 확인하고 싶으신 분들은 아래로.
링크 : http://www-128.ibm.com/developerworks/java/library/j-benchmark2/

'IBM dW review' 카테고리의 다른 글

배시 셸로 작업하기  (0) 2008.08.31
유닉스와 리눅스 함께 어울리기.  (0) 2008.08.31
Ajax에서 XML 처리하기, Part 3  (0) 2008.07.30
10가지 더 좋은 유닉스 습관  (0) 2008.07.30
Ajax에서 XML 처리하기, Part 2  (0) 2008.06.30