자바 개발을 할 때에 프로그램의 동작 시간을 알아야 하는 경우가 있다. 특히 알고리즘 문제를 풀 때에 제한시간 내에 동작해야 하는 것을 테스트 해야할 경우에 유용하다. 물론 직접 체점 시스템에 돌려 봐도 되겠지만 번거롭고 사이트에 따라서 체점에 걸리는 대기 시간이 긴 경우도 있다. 코드 자체는 매우 단순하다. 하지만 내 기억력 문제인지 매번 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을 구동하고 클래스를 컴파일 하는 등의 시간 자체가 기본적으로 가지는 시간이 있기 때문에 이런 것들까지 충분히 고려 해야 할 것이다.
순수하게 특정 부분의 로직에 걸리는 시간을 테스트 하는 것으로 사용하기 적합하다.