그래프를 보기 위해 Profile 클래스가 있다. 이 클래스는 문제 크기의 범위를 인자로 받아 실행하는 코드를 포함하며 실행시간을 측정하고 결과를 그래프에 출력한다.
Profile 클래스를 사용하면 ArrayList와 LinkedList 클래스에 있는 add 메서드의 성능을 분류할 수 있다. 다음 코드를 보자. (ProfileListAdd.java)
public static void profileArrayListAddEnd() {
Timeable timeable = new Timeable() {
List<String> list;
public void setup(int n) {
list = new ArrayList<String>();
}
public void timeMe(int n) {
for (int i=0; i<n; i++) {
list.add("a string");
}
}
};
int startN = 4000;
int endMillis = 1000;
runProfiler("ArrayList add end", timeable, startN, endMillis);
}
private static void runProfiler(String title, Timeable timeable, int startN, int endMillis) {
Profiler profiler = new Profiler(title, timeable);
XYSeries series = profiler.timingLoop(startN, endMillis);
profiler.plotResults(series);
}
이 메서드는 ArrayList의 끝에 새로운 요소를 추가하는 add 메서드의 실행시간을 측정한다.
Profiler 클래스를 사용하려면 setup과 timeMe 메서드를 제공하는 Timeable 객체를 생성해야 한다. setup
메서드는 시간 측정을 시작하기 전에 필요한 일들을 수행한다. 이 경우에는 빈 리스트를 만든다. 그다음 timeMe 메서드는 측정 작업을 한다. 이 경우에는 리스트에 n개의 요소를 추가한다.
timeable 객체를 생성하는 코드는 익명 클래스(anonymous class)로 Timeable 인터페이스를 구현하고 동시에 새로운 클래스의 인스턴스를 생성한다.
다음 단계로 Timeable 객체와 제목을 인자로 넘겨 Profile 객체를 생성한다. Profiler 객체는 인스턴스 변수로 저장된 Timeable 객체를 사용하는 timingLoop 메서드를 제공한다. 이 메서드는 Timeable 객체의 timeMe 메서드를 n의 값 범위에서 여러 번 호출한다. timingLoop 메서드는 다음 두 개의 인자를 받는다.
- startN : 시간 측정을 시작하는 n 값
- endMillis : 밀리 초 단위로 임계치(threshold)를 지정한다. timingLoop에서 문제 크기가 증가하면 이에 따라 실행시간도 늘어난다. 실행시간이 임계치를 넘으면 timingLoop 메서드는 중단된다.
실행하면 다음과 같은 결과를 얻는다.
64000, 16
128000, 30
256000, 84
512000, 82
1024000, 135
2048000, 335
4096000, 639
8192000, 1282
Estimated slope= 0.8695182694423267
첫 번째 열은 문제 크기 n이고 두 번째 열은 밀리 초 단위의 실행시간이다. 앞의 몇몇 측정값은 잡음이 많은 편이다. 따라서 startN 값을 조금더 높게 잡으면서 실행해본다.
timingLoop 메서드의 결과는 이 데이터를 포함하는 XYSeries 객체이다. 이 데이터를 plotResults 메서드에 넘기면 다음 그림과 같은 그래프가 나온다.
'학습 > CS' 카테고리의 다른 글
프로파일 - ArrayListAddBeginning (0) | 2023.02.06 |
---|---|
프로파일 - ArrayListAddEnd 2 (1) | 2023.02.03 |
LinkedList 클래스 2 (0) | 2023.02.03 |
LinkedList 클래스 & 가비지 컬렉션 (0) | 2023.02.03 |
연결 자료구조 & 객체 다이어그램 (1) | 2023.02.02 |