본문으로 바로가기
반응형

자바 개발을 할 때에 프로그램의 동작 시간을 알아야 하는 경우가 있다. 특히 알고리즘 문제를 풀 때에 제한시간 내에 동작해야 하는 것을 테스트 해야할 경우에 유용하다. 물론 직접 체점 시스템에 돌려 봐도 되겠지만 번거롭고 사이트에 따라서 체점에 걸리는 대기 시간이 긴 경우도 있다. 코드 자체는 매우 단순하다. 하지만 내 기억력 문제인지 매번 API가 떠오르지 않아서 필요할 때마다 검색해서 사용하곤 한다.


java에서 현재 시간을 가져오는 API는 System 클래스의 currentTimeMillis() 메소드이다.

이를 이용해 걸리는 시간을 측정하고자 하는 로직의 맨 윗줄에 long 타입 변수를 하나 선언해서 System.currentTimeMillis(); 로 시간을 저장해 두고, 로직이 다 끝난 뒤 다시 System.currentTimeMillis(); 로 시간을 받아온 뒤에 두 시간을 빼주면 걸리는 시간을 알 수 있다.


코드로 구현하면 이런식이다. 3중 for문을 돌며 int형 변수를 선언하고 값을 할당하는 것으로 체크해 봤다.


1
2
3
4
5
6
7
8
9
10
11
12
long start = System.currentTimeMillis();
 
for (int i = 0; i < 100; i++) {
    for (int j = 0; j < 100; j++) {
        for (int j2 = 0; j2 < 1000; j2++) {
            int k = 5;
        }
    }
}
 
long end = System.currentTimeMillis();
System.out.println((end - start)/1000.0);
cs


계산된 시간이 밀리세컨드 이기 때문에 1000으로 나누어서 세컨드 단위로 변경했다.

저 상태에서는 0.05초가 걸렸는데, for문을 하나 더 추가해 4중포문 즉 시간복잡도 O(N^4)으로 돌렸을 때에는 무려 0.66초가 나왔다.


이 방식의 단점은 시간을 받아온 start와 end 사이의 로직 수행 시간만을 계산해 준다는 것이다. 1초 안에 수행되어야 하는 프로그램이 있을 때, 이 방법으로 계산해서 0.99초가 걸린다 하더라도 통과하지 못할 것이다. jvm을 구동하고 클래스를 컴파일 하는 등의 시간 자체가 기본적으로 가지는 시간이 있기 때문에 이런 것들까지 충분히 고려 해야 할 것이다.


순수하게 특정 부분의 로직에 걸리는 시간을 테스트 하는 것으로 사용하기 적합하다.




반응형

 Other Contents