반응형

작년쯤에 국내 컨퍼런스 영상을 보다가 Intellij 개발 환경에서 애플리케이션 성능을 높이는 방법을
본 적이 있었는데 내 컴퓨터에서 intellij 세팅을 하다가 떠올라서 적어보려고 한다.

 

인텔리제이 애플리케이션 실행 옵션에서 다음과 같은 Run Option이 있다.

이는 자바 코드를 JVM 위에 올리고 바이트코드를 JIT 컴파일러로 동적 최적화하는 과정을 일부 생략한 것이다.

JIT 컴파일러는 C1, C2 컴파일러가 존재하는데 -XX:TiredStopAtLevel=1를 설정하면 C1 컴파일만 사용하겠다는 것이다.

로컬 개발 환경에서는 자주 애플리케이션을 껐다 켰다하면서 사용하기 때문에 빠른 앱 실행속도를 위해 기본적으로 활성화돼 있다.

문제는 개발된 코드 양이 많아지고, 연결할 의존성 라이브러리들이 많아지게 되면 앱 실행속도는 빠르지만 띄워놓고 코드를 테스트해볼 때

꽤 큰 성능 저하가 있다.

 

이를 간단하게 테스트해보기 위해 spring에서 난수로 생성한 int list를 정렬하고 끝내는 api를 하나 만들어봤다.

@RestController
public class DemoController {

    @GetMapping("/test")
    public ResponseEntity<String> sortTest() {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        List<Integer> list = IntStream.of(new Random().ints(10_000_000, 0, 10000).toArray()).boxed().collect(Collectors.toList());
        Collections.sort(list);
        stopWatch.stop();
        System.out.println(stopWatch.getTotalTime(TimeUnit.MILLISECONDS));
        return ResponseEntity.ok("ok");
    }
}

 

이를 -XX:TiredStopAtLevel=1를 활성화하고 api를 호출해보았다.

launch optimization 활성화

 

이제 비활성화하고 실행해보자.

launch optimization 비활성화

 

보다시피 활성화를 했을 때는 앱 실행 속도가 빠르고, 정렬은 좀 느리게 수행되었고, 비활성화 했을 때는 앱 실행 속도는 느리지만, 정렬 수행 속도가 빨라진걸 볼 수 있다. 정렬을 수행하는 간단한 코드만 넣어서 실행했음에도 이렇게 꽤 성능이 차이가 나는데 회사에서도 실제 서비스 코드를 실행했을 때는 앱 구동 체감이 훨씬 크게 차이가 났었다.

그러니 개발하는 환경에서 앱 퍼포먼스가 중요한 경우에는 해당 내용을 고려해보도록 하자.

반응형

'개발 > java' 카테고리의 다른 글

[java] junit5  (0) 2024.06.16
[java] 람다와 클로저  (0) 2024.01.28