|
알려주세요 님이 쓰신 글 :
:
: 자료구조를 공부하고 있는 학생입니다.
:
: 다름이 아니라. 자료구조에서 여러가시 실행시간을 측정을 해서 빠르기를 비교하는데요
:
: 보고있는책이 c 로 배우는 알고리즘인데..
:
: 여기서는 bios.h 파일을 포함해서 실행시간을 측정하는 파일을 하나 만들던데..
:
: 혹시나 해서 c++ 에서 똑같이 만들고 해 봤는데..
:
: 컴파일 애러가 나서요..
:
: 책에서는 bios.h 파일에 있는 biostime 이라는 라이브러리 함수를 사용했는데..
:
: c++ 에서 다른 방법으로 시간을 측정할수 있는 방법을 알고 싶습니다.
bios.h의 함수들은 도스용 터보/볼랜드 C에서만 사용할 수 있습니다.
윈도용 컴파일러에는 없습니다.
가능한 한 ANSI C/C++ 호환 함수를 사용하는 방법을 쓰실 것을 권합니다.
ANSI C 라이브러리 함수중 시간을 측정하는 함수는 clock()과 time()이 있는 데,
clock()은 알고리듬의 수행 시간 측정용으로 쓰기는 좀 부정확합니다.
정확한 시간이 아니라, 프로세서 시간(processor time)을 측정하기 때문입니다.
(싱글태스킹인 도스 시절에는 비교적 정확했지만, 여러 프로세스가 한꺼번에 동작하는
멀티태스킹 환경인 윈도에서는 상당히 부정확합니다.)
그러므로 time()을 쓰시는 것이 좋습니다.
time()은 매초 마다 한 번씩 클럭 틱(clock tick)을 발생시키므로,
1초 동안 루프를 반복한 횟수를 카운트하면 됩니다.
대략의 소스 코드를 적으면 다음과 같습니다.
int count = 0;
time_t start, finish;
start = time(0);
do {
++count;
// 알고리듬 수행 코드를 넣습니다.
finish = time(0);
} while (finish == start);
만약, 1초에 128번 루프가 반복되었다면,
알고리듬이 1번 수행되는 데 걸린 시간은 1/128 s = 7.8125 ms 이 되는 것이죠.
그런데, 한 번만 측정하면 역시 오차가 있을 수 있기 때문에,
여러번 측정하여 평균(mean, average)을 구하거나,
간단하게는 중앙값(median)으로 구하면 됩니다(보통 시작할 때와 끝날 때에 편차가 크기 때문입니다.)
또한 위의 시간에는 루프 자체의 오버헤드가 포함되어 있습니다.
(time 함수 호출 부분, count 변수 증가 부분, 루프 종료 조건 검사 부분 등)
그러므로, 알고리듬 호출이 생략된 루프의 소요 시간을 별도로 측정
(간단하게는 알고리듬 수행 부분을 주석으로 막으면 되겠죠.)하신 후,
위의 시간에서 빼주면 되겠죠.
이상의 설명은
David R. Musser et al., STL Tutorial and Reference Guide, Second Edition의 인포북 번역판의
설명을 기초로 했습니다.
이 책에는 이러한 시간 측정을 자동화하는 클래스를 정의한 소스 코드가 있습니다.
더 자세한 설명이 필요하시면 이 책을 보세요.
|