Home
Java
자바 시간 성능 측정 (nanoTime(), currentTimeMillis(), Instant.now())
devfoxstar
devfoxstar
August 13, 2022
1 min

Table Of Contents

01
currentTimeMillis()
02
nanoTime()
03
Instant.now()
04
결론

개발 코드를 작성하고 성능을 체크하는 경우가 있습니다.
요즘엔 워낙 좋은 라이브러리가 많지만, 직접 해보는 것도 나쁘지 않습니다.

자바에서는 주로 시간 메서드를 활용해서 측정합니다.


currentTimeMillis()

  • 밀리초 단위 사용 (ms)
  • 1970년 1월 1일 UTC 시작 시점을 기준으로 현재까지 계산
  • 시스템 시간을 참조 (운영체제의 시간 값을 기준)
  • 1초 = 1000 밀리초
package com.devfoxstar.codingtest;

public class Time {

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

        long count = 0;
        for (int i = 0; i < 100000; i++) {
            for (int j = 0; j < 100000; j++) {
                count++;
            }
        }

        long endTime = System.currentTimeMillis();
        long elapsedTime  = endTime - startTime;

        System.out.println("currentTime : " + count + "회");    //currentTime : 10000000000회
        System.out.println(startTime);                          //1660401665296 
        System.out.println(endTime);                            //1660401665649
        System.out.println(elapsedTime);                        //353

        //밀리초를 초로 바꾸는 방법
        System.out.println((double)elapsedTime / 1000);         //0.353
    }

}

nanoTime()

  • Java 1.5부터 도입
  • 나노초 단위 사용 (ns)
  • 기준 시점에서 경과 시간을 측정
  • 시스템 시간과는 무관
  • 1초 = 1e+9 나노초
package com.devfoxstar.codingtest;

import java.util.concurrent.TimeUnit;

public class Time {

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

        long count = 0;
        for (int i = 0; i < 100000; i++) {
            for (int j = 0; j < 100000; j++) {
                count++;
            }
        }

        long endTime = System.nanoTime();
        long elapsedTime  = endTime - startTime;

        System.out.println("nanoTime : " + count + "회");   //nanoTime : 10000000000회
        System.out.println(startTime);                      //38455671946200
        System.out.println(endTime);                        //38455976169400
        System.out.println(elapsedTime);                    //304223200

        //나노초를 초로 바꾸는 세 가지 방법
        System.out.println(TimeUnit.NANOSECONDS.toSeconds(elapsedTime));    //0.30422320
        System.out.println(((double)elapsedTime ) / 1_000_000_000);         //0.3042232
        System.out.println(elapsedTime * 1e-9);                             //0.3042232
    }

}

Instant.now()

  • Java 1.8부터 도입된 시간 객체
  • 1970년 1월 1일 UTC 시작 시점을 기준으로 현재까지 계산
  • 시스템 시간을 참조 (운영체제의 시간 값을 기준)
  • 밀리초 (toMillis), 초 (getSeconds) 모두 계산 가능
package com.devfoxstar.codingtest;

import java.time.Duration;
import java.time.Instant;

public class Time {

    public static void main(String[] args) {
        Instant startTime = Instant.now();

        long count = 0;
        for (int i = 0; i < 100000; i++) {
            for (int j = 0; j < 100000; j++) {
                count++;
            }
        }

        Instant endTime = Instant.now();
        long elapsedTime  = Duration.between(startTime, endTime).toMillis();    

        System.out.println("InstantNow : " + count + "회");     //InstantNow : 10000000000회
        System.out.println(startTime);                          //2022-08-13T15:27:34.671396800Z
        System.out.println(endTime);                            //2022-08-13T15:27:35.456313900Z
        System.out.println(elapsedTime);                        //784

        //밀리초를 초로 바꾸는 방법
        System.out.println((double)elapsedTime / 1000);         //0.784
    }

}

결론

정교한 시간 성능을 측정하기 위해서는 nanoTime()을 추천합니다.
시스템 시간과 상관없이 정확한 시간 측정이 가능합니다.

하지만 nanoTime()은 일부 서버 환경에서는 정확하지 않습니다.

이때는 currentTimeMillis(), Instant.now()를 활용할 수 있습니다.
시스템 시간을 활용하면 현재 시각을 기준으로 다양한 계산이 가능합니다.

물론 운영체제의 시간 설정이 일정하다는 전제 조건이 필요합니다.


Tags

#Java#nanoTime#currentTimeMillis

Related Posts

Java - Record class (불변 데이터 객체 만들기)
June 11, 2024
1 min
© 2024, All Rights Reserved.

Quick Links

About Me

Media