prgrms-web-devcourse / BE-Team-preArmand-Book-study

2 stars 2 forks source link

[아이템53] 가변인수는 신중히 사용하라 - 실험공유 #26

Closed kimziou77 closed 2 years ago

kimziou77 commented 2 years ago

궁금증의 시작

그런데 성능에 민감한 상황이라면 가변인수가 걸림돌이 될 수 있다. 가변인수 메서드는 호출될 때마다 배열을 새로 하나 할당하고 초기화 한다. - 321p

과연 정말 유의미한 차이가 있을까?

가변인수를 인자로 받는 메서드 vs 일반인수를 인자로 받는 메서드

실험 대상 메서드는 다음과 같습니다

// 가변인수를 인자로 받는 메서드
  void variable(String... item) { 
         return ;
  }
// 일반인수를 인자로 받는 메서드
  void normal(String item1, String item2, String item3, String item4) { 
         return ;
  }

실험환경

Win10 64비트 image

테스트

String 인자 4개를 대상으로, (1억)100,000,000번 실행해보았을때의 성능 테스트를 진행해 보았습니다.

public class EffectiveJavaTime {

    String a = "a";
    String b = "b";
    String c = "c";
    String d = "d";

    @Test
    void timeTest1(){
        long start = System.nanoTime();
        for (int i = 0; i < 100_000_000; i++) variable(a, b, c, d);
        long end = System.nanoTime();
        System.out.println("가변인수 : " + (end - start));
    }

    @Test
    void timeTest2(){
        long start = System.nanoTime();
        for (int i = 0; i < 100_000_000; i++) normal(a, b, c, d);
        long end = System.nanoTime();
        System.out.println("일반인수 : " + (end - start));
    }

    void variable(String... item) {
        return ;
    }
    void normal(String item1, String item2, String item3, String item4) {
        return ;
    }
}

결과

결과가 나왔습니다. 확실히 가변인수가 시간이 더 오래걸리네용 image

이걸 10번정도 반복한 평균은 다음과 같습니다. 가변인수 : 14,983,366 nanotime (14.98 ms) 일반인수 : 3,438,500 nanotime (3.43 ms) → 실험 결과, 가변인수가 일반인수보다 4.35배 더 오래 걸린다고 나오네요!

궁금증 ❓

대충 머리속에 있는 실험을 해보았는데, 뭔가 이 실험에서 이상한 부분이 있을까요 🤔 피드백 주시면 감사히 받겠습니다!! 이런 실험은 어떻게 하는게 좋을까요

yuminhwan commented 2 years ago

직접 실험해보고 결과 내는 모습 멋있네요. 👍 반성하게 됩니다 ㅎㅎ 간단하게 실험하는 거라면 수빈님이 하신 것처럼 하면 되지 않을까요??

epicblues commented 2 years ago

System.nanoTime(); 메모

실험 덕분에 기억에 잘 남을 것 같아요! 감사합니다.✍️

학습 테스트의 성격이 강해 보여서 저 같은 늅이 보기에는 이상한 점은 안보입니다!

억지?로 피드백하자면(이미 알고 계실 확률 9999%), 앞으로도 이러한 성능 체크 실험을 자주 하실 예정이라면면 따로 테스트용 모듈?은 만드는 건 어떨까 싶습니다.

public class TimeTest {

  private TimeTest() {/*no-op*/}

  public static Long checkTime(Runnable testTarget, Long count) {
    long start = System.nanoTime();
    for (int i = 0; i < count; i++) {
      testTarget.run();
    }
    long end = System.nanoTime();
    return end - start;
  }
}
HunkiKim commented 2 years ago

항상 실습하는 모습 본받고 갑니다..