아프리카 asp 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · web view11....

21
© 2008, Nowcom 솔솔솔 솔솔솔 솔솔 솔솔 솔솔 프프프프 : 프프 프프 프프 프프 : 1.0 프프프 : 프프프 프프프 : 2008/10/21 1

Upload: others

Post on 19-Jan-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

시간 측정 함수

프로젝트 : 시간 측정 함수

버전 : 1.0

작성자 : 허남구

작성일 : 2008/10/21

1

Page 2: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

목차

1. 조사 주제..................................................................................................................................42. 조사 목적..................................................................................................................................43. 배경 지식..................................................................................................................................4

3.1. timer 기능 함수의 원리......................................................................................................43.2. timer 기능 함수의 리턴값..................................................................................................4

4. 조사 내용..................................................................................................................................44.1. time() 함수......................................................................................................................4

4.1.1. 함수 정의................................................................................................................44.1.2. 함수 설명................................................................................................................54.1.3. 관련 함수 및 데이터..................................................................................................5

4.2. clock() 함수.....................................................................................................................64.2.1. 함수 정의................................................................................................................64.2.2. 함수 설명................................................................................................................64.2.3. 관련 함수 및 데이터..................................................................................................7

4.3. GetTickCount() 함수........................................................................................................74.3.1. 함수 정의................................................................................................................74.3.2. 함수 설명................................................................................................................74.3.3. 관련 함수 및 데이터..................................................................................................7

4.4. timeGetTime() 함수.........................................................................................................84.4.1. 함수 정의................................................................................................................84.4.2. 함수 설명................................................................................................................84.4.3. 관련 함수 및 데이터..................................................................................................8

4.5. QueryPerformanceCounter() 함수...................................................................................94.5.1. 함수 정의................................................................................................................94.5.2. 함수 설명................................................................................................................94.5.3. 관련 함수 및 데이터..................................................................................................9

5. 심화 연구................................................................................................................................105.1. time() 함수....................................................................................................................105.2. 데이터 오버플로우에 따른 처리.........................................................................................105.3. 멀티미디어 타이머...........................................................................................................105.4. 고해상도 타이머..............................................................................................................105.5. RDTSC..........................................................................................................................115.6. Quanturm.....................................................................................................................125.7. Clock tick......................................................................................................................13

2

Page 3: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

5.8. QueryPerformanceCounter() 사용시 SetThreadAffinityMask() 의 사용............................146. 테스트 프로그램.......................................................................................................................14

6.1. 작성 환경 및 도구............................................................................................................146.2. 시스템 구조....................................................................................................................146.3. 주요 로직.......................................................................................................................15

7. 테스트 케이스..........................................................................................................................158. 테스트 결과.............................................................................................................................16

8.1. time() 함수....................................................................................................................168.2. clock() 함수...................................................................................................................168.3. GetTickCount() 함수......................................................................................................168.4. timeGetTime() 함수.......................................................................................................178.5. QueryPerformanceCounter() 함수.................................................................................178.6. 체크된 평균 수행 시간......................................................................................................178.7. 결과 평가.......................................................................................................................17

9. timer 함수 자체 속도 테스트 결과..............................................................................................189.1. time() 함수....................................................................................................................189.2. clock() 함수...................................................................................................................189.3. GetTickCount() 함수......................................................................................................189.4. timeGetTime() 함수.......................................................................................................199.5. QueryPerformanceCounter() 함수.................................................................................199.6. timer 함수 평균 수행 시간...............................................................................................199.7. 결과 평가.......................................................................................................................19

10. 특징 및 활용 방안...................................................................................................................2010.1. time() 함수..................................................................................................................2010.2. clock() 함수.................................................................................................................2010.3. GetTickCount() 계열의 함수..........................................................................................2010.4. timeGetTime() 함수.....................................................................................................2010.5. QueryPerformanceCounter().......................................................................................21

11. 참고 서적 및 인터넷 사이트......................................................................................................21

3

Page 4: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

1. 조사 주제Windows 환경에서 지원하는 시간 측정 함수 종류 분석 및 사용법과 특징 정리

2. 조사 목적시간 측정 함수의 종류와 사용법, 특징을 조사하여 각 함수의 작동 원리를 이해하고, 나아가 지정된 로직, 함수, 프로세스 등에 대한 시간 측정 시 적합한 함수를 선택하여 사용할 수 있는 기본 지식을 습득하는 것을

목적으로 함

3. 배경 지식

3.1. timer 기능 함수의 원리

1. 커널 영역이나 어플리케이션 영역의 특정 메모리 영역에 시간 관련 값을 카운트

2. PC 특정 장치의 타이머를 이용하여 카운트

2. 실제 동작 주파수를 카운트

장단점: 메모리 카운트 영역의 값을 가져오는 방법은 정밀도가 떨어지지만 시스템 부하가 적고, 실제 동작 주파수를 카운트하여 구하는 방법은 정밀도는 높지만 시스템 부하가 커짐

3.2. timer 기능 함수의 리턴값

1. 과거에 협의에 의해 정한 특정 시간대를 기준으로 현재 시간과의 차이값

2. 시스템 시작, 윈도우 시작 시간과의 차이값

3. CPU, 기타 장치의 순간 Tick 장단점: 2 의 방식을 사용하는 함수는 정확도가 높으며, 1 의 방식을 사용하는 함수는 정확한 표준

시각을 얻을 수 있음

4. 조사 내용

4.1. time() 함수

4.1.1. 함수 정의

* 원형: time_t time( time_t *timer );

- 리턴값

time_t 는 long 타입의 값. 초단위의 시간값을 리턴.4

Page 5: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

- 인자 1 (timer)time_t 변수의 포인터를 넘겨받아 리턴값과 같은 time_t 결과값을 저장

사용하지 않는 경우 NULL 사용 가능

4.1.2. 함수 설명

- time.h 를 include 하여 사용

- 1970/01/01 00:00:00 GMT 로부터 현재까지의 초단위 시간 차이를 구함

- 이 시간값은 UTC 이며, 정확한 지역 시각을 구하기 위해서는 지역에 따른 GMT 보정 시간을

계산해주어야 함

- 우리나라의 경우 (GMT +9), 즉 GMT 보다 9시간 더 빠른 시간대를 사용 중

- 32비트 제한으로 인해 최대 표현 범위는 2038/01/18 까지

- 64비트 버전인 _time64() 함수는 3000/12/31 까지 표현 가능

4.1.3. 관련 함수 및 데이터

* struct tm

struct tm{

int tm_sec; // [0, 59]int tm_min; // [0, 59]int tm_hour; // [0, 23]int tm_mday; // [1, 31]int tm_mon; // [0, 11]int tm_year; // since 1900int tm_wday; // Sunday 0 [0, 6]int tm_yday; // since January 1 [0, 365]int tm_isdst; // daylight savings time flag

};

- time_t 는 경과초를 32비트 정수값으로 저장해두므로 사용하기 불편

- struct tm 은 시간 요소를 분리하여 사용자가 쉽게 알 수 있도록 정의한 구조체

* struct tm *gmtime(const time_t *timer);

5

Page 6: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

- time_t 를 세계 표준시로 변환

* struct tm *localtime(const time_t *timer);

- time_t 를 지역 시간으로 변환

* time_t mktime(struct tm *timeptr);

- struct tm 구조체 변수를 time_t 타입으로 변환

* double difftime( time_t timer1, time_t timer0 );

- 두 시간 차이를 double 실수형으로 리턴. time_t 가 초단위이므로 정밀하지 않음

4.2. clock() 함수

4.2.1. 함수 정의

* 원형: clock_t clock( void );

- 리턴값

clock_t 는 long 타입의 값. 클럭 틱 값을 리턴. 표현 범위를 벗어난 만큼의 시간의 경우 –1 을

리턴.

4.2.2. 함수 설명

- time.h 를 include 하여 사용

- 프로세스가 시작된 시점부터의 클럭 틱을 구함

- 리턴된 클럭 틱 값을 초당 클럭틱 개수(CLOCKS_PER_SEC)로 나누면 초 단위로 변경 가능

- 윈도우에서는 CLOCKS_PER_SEC 가 1000으로 정의되어 있으므로, 윈도우 시스템에서는 리턴 값

자체를 ms 단위로 가정할 수 있음

- 55ms 정도 정밀도를 가짐

4.2.3. 관련 함수 및 데이터

*

6

Page 7: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

4.3. GetTickCount() 함수

4.3.1. 함수 정의

* 원형: DWORD GetTickCount( void );

- 리턴값

ms 단위의 시간

4.3.2. 함수 설명

- API 함수로 windows.h 를 include 하여 사용

- 시스템이 시작한 시점부터의 ms 단위 시간을 구함

- 32비트 제한이 있으므로 시스템 시작 후 49.7 일이 경과하면 오버플로우가 발생하여 다시 0부터

카운트한 결과를 넘겨줌

- Win98 은 55ms, NT 패밀리는 10~16ms 정도의 정밀도를 가짐

4.3.3. 관련 함수 및 데이터

* void GetLocalTime( LPSYSTEMTIME lpSystemTime );

- 지역 시각을 구함

* void GetSystemTime( LPSYSTEMTIME lpSystemTime );

- 시스템 시각을 구함 (UTC)

* struct SYSTEMTIME

struct SYSTEMTIME{

WORD wYear;WORD wMonth;WORD wDayOfWeek;WORD wDay;WORD wHour;

7

Page 8: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

WORD wMinute;WORD wSecond;WORD wMilliseconds;

};

4.4. timeGetTime() 함수

4.4.1. 함수 정의

* 원형: DWORD timeGetTime( VOID );

- 리턴값

ms 단위의 시간

4.4.2. 함수 설명

- API 함수로 windows.h 를 include 하며, Mmsystem.h include, winmm.lib 를 링크하여 사용

- Multimedia timer 로 불리움

- 윈도우가 시작한 시점부터의 ms 단위 시간을 구함

- 32비트 제한이 있으므로 시스템 시작 후 49.7 일이 경과하면 오버플로우가 발생하여 다시 0부터

카운트한 결과을 넘겨줌

- Win9x 는 1ms, NT 패밀리는 5ms 이상의 정밀도를 가짐

- 정밀도를 제어하는 함수를 제공

4.4.3. 관련 함수 및 데이터

* MMRESULT timeBeginPeriod( UINT uPeriod );

- 최소 타이머 정밀도 설정

* MMRESULT timeEndPeriod( UINT uPeriod );

- 이전에 호출된 timeBeginPeriod() 함수 설정을 해제

8

Page 9: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

4.5. QueryPerformanceCounter() 함수

4.5.1. 함수 정의

* 원형: BOOL QueryPerformanceCounter( LARGE_INTEGER *lpPerformanceCount );

- 리턴값

성공 : TRUE, 실패 : FALSE- 인자 1

현재 performance-counter 값을 가져올 구조체 변수 포인터

4.5.2. 함수 설명

- API 함수로 windows.h 를 include 하여 사용

- high-resolution 로 불리며, 가장 높은 정밀도를 보여줌

- QueryPerformanceFrequency() 함수를 통해 구한 주파수로 나누어주면 ms 단위 시간을 구할 수

있음

- single 프로세서가 아닐 경우 쓰레드 배분에 따라 결과의 신뢰도를 보장할 수 없음

- SetThreadAffinityMask() 함수를 사용하여 쓰레드 통제 가능

4.5.3. 관련 함수 및 데이터

* BOOL QueryPerformanceFrequency( LARGE_INTEGER *lpFrequency );

- 초당 주파수를 얻음

* DWORD_PTR SetThreadAffinityMask( HANDLE hThread, DWORD_PTR dwThreadAffinityMask );

- 지정된 쓰레드를 하나의 프로세서에만 수행하도록 통제

9

Page 10: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

5. 심화 연구

5.1. time() 함수

운영체제 커널의 일정한 메모리 영역에 시간을 초단위로 카운트하여 저장하는 영역이 있음

time() 함수를 사용하면 정확한 절대 시간을 측정할 수 있으며, 동일 영역의 값을 읽어오는 모든

함수는 같은 결과값을 반환함

예를 들어 제어판의 시간 설정을 변경할 경우 time(), GetSystemTime() 등 같은 메모리 영역을

액세스하는 함수류에 모두 영향을 미침

5.2. 데이터 오버플로우에 따른 처리

GetTickCount() 함수와 timeGetTime() 함수는 32비트의 제한으로 인해 49.7 일이 경과하면

오버플로우가 발생하여 다시 0부터 카운트 한 결과를 리턴함 - clock() 함수는 오버플로우 발생시 –

1 리턴

서버 환경 등 장시간 운영하는 시스템의 경우 예상치 못한 문제가 야기될 수 있음

5.3. 멀티미디어 타이머

사운드 카드에 내장된 타이머를 이용하는 방식 (timeGetTime) 사운드 카드 종류에 따라 정상작동하지 않는 경우도 있음

5.4. 고해상도 타이머

RDTSC (CPU 내부에 있는 카운터) 를 이용

Mnemonic code(assembly) 나 Instruction Hexa code 로 대체할 수 있음

CPU 가 RDTSC 를 갖지 못하는 경우 주파수는 0 으로 조사되어 고해상도 타이머를 이용할 수 없음

10

* 아래와 같은 방법을 사용하면 49.7 일이 경과해도 정확한 값을 얻을 수 있다.

DWORD GetDiffTick( DWORD dwTickFrom, DWORD dwTickTo ){ if( dwTickTo >= dwTickFrom ) return dwTickTo - dwTickFrom; // 시작이 끝보다 작을 경우 return dwTickTo + (0xffffffffU-dwTickFrom) + 1; // 부팅 후 49.71 일을 넘었다.}

Page 11: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

5.5. RDTSC

인텔 펜티엄부터 TSC 카운터 (클럭을 카운터) 가 추가되었으며, 이에 따라 어셈 명령어 중 R(Read from time stamp counter) 와 RDTSCEX 명령어가 추가됨

(인텔 펜티엄급 이상에서만 사용 가능) rdtsc 명령은 내부 TSC 카운터의 값을 EDX 와 EAX 레지스터에 복사하는 명령 (6~11 클럭을

소요함) rdtscEx 명령은 36 클럭을 소요하며, 측정 구간을 클럭단위로 측정할 수 있는 측정 방법

rdtsc 명령을 수행할 때 CPU 가 수행속도 향상을 위해 CPU 명령 순서를 바꿀 수 있기 때문에

정확한 측정을 위해 CPUID 명령을 먼저 수행해 명령 순서를 맞추어야 함

* RDTSC 명령어를 사용하는 어셈코드 예제

#define rdtsc(x) \{ __asm __emit 0fh __asm __emit 031h __asm mov x, eax}#define rdtscEx(low, high) \{ __asm __emit 0fh __asm __emit 031h __asm mov low, eax _asm mov high, edx}#define cpuid {__asm __emit 0fh __asm __emit 0a2h}

* 어셈 코드를 호출하여 사용하는 방법 예제

LARGE_INTEGER start, end, tmp;__int64 freq, diff;

if (QueryPerformanceFrequency((LARGE_INTEGER*)&freq)) { rdtscEx(start.LowPart, start.HighPart); printf("Performance Frequency is %I64d\n", freq); rdtscEx(end.LowPart, end.HighPart); printf("Preformance Resolution is %4.3f micro sec.\n",

0/freq * 1000000);diff = *(__int64*)&end - *(__int64*)&start;printf("printf elapsed clock cycle is %I64d\n", diff);printf("printf elapsed time is %4.3f micro sec.\n",

(double)diff/266); // 클럭에 따라 이 부분이 바뀌어야함

rdtscEx(start.LowPart, start.HighPart);

11

Page 12: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

rdtscEx(tmp.LowPart, tmp.HighPart); // 1 rdtscEx(tmp.LowPart, tmp.HighPart); rdtscEx(tmp.LowPart, tmp.HighPart); rdtscEx(tmp.LowPart, tmp.HighPart); rdtscEx(tmp.LowPart, tmp.HighPart); rdtscEx(tmp.LowPart, tmp.HighPart); rdtscEx(tmp.LowPart, tmp.HighPart); rdtscEx(tmp.LowPart, tmp.HighPart); rdtscEx(tmp.LowPart, tmp.HighPart); rdtscEx(tmp.LowPart, tmp.HighPart); // 10 rdtscEx(end.LowPart, end.HighPart);

printf("rdtscEx elapsed clock clycle is %I64d\n", (*(__int64*)&end - *(__int64*)&start)/10);}

5.6. Quanturm

윈도우의 쓰레드는 실행될 차례가 되었을 때 퀀텀(quantum) 단위만큼 수행하며 이 값은

레지스트리 설정에 따라 변경할 수 있음

Windows 2000 Professional/XP 는 기본 6 퀀텀, Windows 2000/2003 Server 는 기본 36 퀀텀으로 쓰레드가 수행

윈도우는 클럭 인터럽트가 발생할 때마다 수행 중인 쓰레드에 배정된 퀀텀으로부터 3을 빼고, 퀀텀이 0이 되면 다른 쓰레드가 실행될 수 있도록 쓰레드를 선점

윈도우 2000 커널 (2000, 2003, XP) 의 클럭 인터럽트는 10ms 주기로 발생

따라서 기본 쓰레드 수행 시간은

(10 ms) X (6 / 3) = 20ms 임을 알 수 있음

12

Page 13: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

5.7. Clock tick

시스템 타이머가 시간을 기록하는 시간 단위를 Clock tick 이라고 함

Clock tick 은 운영체제별로 다르며 시스템 타이머 해상도는 아래와 같음

OS System timer resolutionWindows 95 55msWindows 98 55msWindows NT 3.51 10msWindows NT 4.0 10msWindows 2000 10msWindows XP 10-15ms

WM_TIMER 메시지는 기본적으로 시스템 타이머의 tick 을 사용

이 값은 CLK_TCK 상수로 지정되며, 요즘의 컴파일러에서는 CLOCKS_PER_SEC 를 지칭

예전 IBM PC 시스템에서는 매 55ms 간격으로 한 개씩 틱이 발생, 이것은 초당 18.2 번이므로

CLK_TCK 은 18.2 로 설정되어 있었음

현재는 CLK_TCK 이 CLOCKS_PER_SEC 를 지칭하며, 이 값은 1000 으로 지정됨

Clock tick 값의 Interval

Tick Interval70170093 1570170109 1670170125 1670170140 1570170156 1670170171 1570170187 1670170203 1670170218 1570170234 16

결과에서 15~16 번의 Tick interval 이 유지됨을 알 수 있으며, clock 은 1ms 마다 바뀌므로

15~16 ms 마다 한번씩 메모리 영역에 기록됨을 알 수 있음. 이것은 1초에 63~64 회 가량

기록됨을 뜻함.

13

Page 14: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

5.8. QueryPerformanceCounter() 사용시 SetThreadAffinityMask() 의 사용

Performance counter 측정 결과는 프로세서 개수에 따라 정확하지 않을 수 있음

SetThreadAffinityMask() 함수는 Bit mask 에 따라 지정된 핸들의 쓰레드가 수행될

프로세서코어를 결정할 수 있음

예> 001 => 첫번째 코어 지정, 010 => 두번째 코어 지정, 100 => 세번째 코어 지정, 011 => 첫번째와 두번째 코어 지정, 111 => 첫번째부터 세번째까지 코어 지정

오른쪽은 SetThreadAffinityMask() 함수를 사용한 결과.그림과 같이 SetThreadAffinityMask() 함수 호출 이전까지의 쓰레드가 두 코어에서 모두

수행되다, 호출 후 지정한 코어에서만 수행되는 것을 볼 수 있음

6. 테스트 프로그램

6.1. 작성 환경 및 도구

CPU 펜티엄 D 2.80 GHzMEMORY 3GB (PC2-5300)운영체제 윈도우 XP Professional SP3개발툴 Visual Studio 2003사용언어 C++동작 플랫폼 다이얼로그

라이브러리 MFC, SDK테스트 방법 각 함수 10번씩 테스트

6.2. 시스템 구조

각 다이얼로그에 테스트 버튼으로 구성

14

Page 15: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

6.3. 주요 로직

7. 테스트 케이스

15

CDialog::OnBnClickedFun…(){

// 시작 시간 측정ProcessFormula() ; // 일정 연산 수행// 끝 시간 측정

}

CDialog::ProcessFormula(){

double result = 0.0l, lfIndex = 0.0l;

for(;lfIndex < 1000000.0l; lfIndex += 0.01l)result += (lfIndex / 10.0l) * (lfIndex / 10.0l) * (lfIndex / 10.0l);

}

Page 16: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

8. 테스트 결과

※ 수행 시간은 초단위 임

8.1. time() 함수

수행 순번 수행 시간 수행 순번 수행 시간

1 5.000 6 4.0002 5.000 7 5.0003 5.000 8 5.0004 5.000 9 5.0005 5.000 10 5.000

8.2. clock() 함수

수행 순번 수행 시간 수행 순번 수행 시간

1 4.797 6 4.7502 4.797 7 4.7343 4.781 8 4.7974 4.781 9 4.7505 4.781 10 4.781

8.3. GetTickCount() 함수

수행 순번 수행 시간 수행 순번 수행 시간

1 4.765 6 4.7502 4.734 7 4.7503 4.750 8 4.7814 4.750 9 4.8135 4.797 10 4.765

16

Page 17: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

8.4. timeGetTime() 함수

수행 순번 수행 시간 수행 순번 수행 시간

1 4.759 6 4.8092 4.764 7 4.7503 4.784 8 4.7844 4.794 9 4.7945 4.796 10 4.804

8.5. QueryPerformanceCounter() 함수

수행 순번 수행 시간 수행 순번 수행 시간

1 4.77620 6 4.815392 4.80337 7 4.819833 4.79831 8 4.840544 4.76585 9 4.810375 4.83205 10 4.85428

8.6. 체크된 평균 수행 시간

함수 종류 체크된 평균 수행 시간

time() 4.90000clock() 4.77490GetTickCount() 4.76550timeGetTime() 4.78380QueryPerformanceCounter()

4.81162

8.7. 결과 평가

time() 함수 사용 시 1 초 단위의 시간을 얻을 수 있어 정밀도가 떨어지는 것을 알 수 있음

clock() 함수 사용시 체크된 로직 평균 수행 시간은 4.7749, GetTickCount() 함수 사용시 체크된

평균 로직 수행 시간은 4.7665 로 거의 비슷함을 알 수 있음

clock() 함수와 GetTickCount() 함수는 둘 다 카운트 된 클럭 틱을 사용하므로 체크된 로직

수행시간 연산 결과가 동일한 주기를 가짐을 알 수 있음

17

Page 18: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

클럭 틱을 사용하는 함수는 일정한 15~16ms 단위의 주기를 갖는데, 이것이 클럭 틱 주기와 관계된

것임을 짐작할 수 있음

timeGetTime() 함수는 일정한 주기를 가지지 않는 것으로 보아 클럭 틱 방식이 아닌 다른 카운트

방식을 사용함을 알 수 있음

timeGetTime() 함수 사용시 체크된 평균 로직 수행 시간은 4.7838 로, 클럭 틱을 사용하는 방식에

비해 약간 더 나오며, 이것은 클럭 틱 주기 사이의 오차를 보정하기 때문으로 짐작됨

QueryPerfomanceCounter() 함수 사용 시에는 클럭 틱 사용 방식에 비해 좀 더 정밀한 측정

결과를 보여줌을 알 수 있음

9. timer 함수 자체 속도 테스트 결과

※ 수행 시간은 초단위 임, 각 10만번 수행한 시간 결과, QueryPerformanceCounter() 함수를 사용하여

측정

9.1. time() 함수

수행 순번 수행 시간 수행 순번 수행 시간

1 0.00731847 6 0.007235302 0.00875768 7 0.007253533 0.00738633 8 0.007364124 0.00859962 9 0.007144655 0.00735166 10 0.00746431

9.2. clock() 함수

수행 순번 수행 시간 수행 순번 수행 시간

1 0.00812206 6 0.008166172 0.00923824 7 0.009011443 0.00964787 8 0.009305324 0.01065397 9 0.008098605 0.00824017 10 0.00923727

9.3. GetTickCount() 함수

수행 순번 수행 시간 수행 순번 수행 시간

1 0.00108559 6 0.00116219

18

Page 19: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

2 0.00129657 7 0.001116003 0.00114785 8 0.001093624 0.00108308 9 0.001082985 0.00109172 10 0.00129684

9.4. timeGetTime() 함수

수행 순번 수행 시간 수행 순번 수행 시간

1 0.00682846 6 0.006778202 0.00698030 7 0.008235843 0.00685163 8 0.006891004 0.00786840 9 0.006864685 0.00690108 10 0.00682564

9.5. QueryPerformanceCounter() 함수

수행 순번 수행 시간 수행 순번 수행 시간

1 0.03754699 6 0.039879952 0.03900377 7 0.037232843 0.03983617 8 0.041284324 0.04012512 9 0.040626835 0.03688819 10 0.04156132

9.6. timer 함수 평균 수행 시간

함수 종류 timer 함수 평균 수행 시간

time() 0.007587567clock() 0.008972111GetTickCount() 0.001145644timeGetTime() 0.007102523QueryPerformanceCounter()

0.039398550

9.7. 결과 평가

GetTickCount() 함수의 수행 속도가 가장 빠름

19

Page 20: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

QueryPerformanceCounter() 함수를 제외한 다른 함수는 직접 메모리 영역에 접근해 값을

읽어오는 반면에, GetTickCount() 함수는 운영체제에게 요청시 바로 카운트 값을 넘겨받을 수 있기

때문인 것으로 짐작됨

QueryPerformanceCounter() 함수의 오버헤드가 가장 큰 것을 알 수 있음 (GetTickCount 를

제외하고 다른 함수와 비교시 5~6배 가량의 차이)

10. 특징 및 활용 방안

10.1. time() 함수

초단위의 시간을 얻을 수 있기 때문에 특정한 시점 단위 사이의 시간을 측정하는 용도에는

일반적으로 적합하지 않음

표준 함수이기 때문에 운영체제 및 시스템에 관계없이 사용 가능

지정된 메모리 영역을 억세스하며, 속도는 보통

표준 시각을 구하는데 사용 가능

10.2. clock() 함수

ms 단위의 시간을 얻을 수 있기 때문에 특정한 시점 단위 사이의 시간을 측정하는 용도에 쓰일 수

있음

표준 함수이기 때문에 운영체제 및 시스템에 관계없이 사용 가능

프로세스 내부 영역에 해당 프로세스가 시작된 순간부터의 Tick 을 카운트, 속도는 보통

프로세스 수행 시간을 알 수 있음

Tick 단위 카운트이므로 정밀도가 떨어짐

10.3. GetTickCount() 계열의 함수

윈도우가 시작하는 순간부터 커널 영역에 Tick 을 카운트

저장 영역은 다르지만 clock() 함수와 같이 Tick 을 카운트하므로 정밀도는 거의 비슷함

다른 timer 함수에 비해 수행 속도가 가장 빠르므로 오버헤드를 최소화하는 시스템 구성에 적합함

(서버 등) Tick 단위 카운트이므로 정밀도는 떨어짐

네트워크 관련 측정에 ms 단위의 정밀함은 크게 요구되지 않으므로 자주 쓰임

10.4. timeGetTime() 함수

20

Page 21: 아프리카 ASP 개발 문서cfs12.blog.daum.net/attach/29/blog/2008/10/31/09/28... · Web view11. 참고 서적 및 인터넷 사이트 21 조사 주제 Windows 환경에서 지원하는

© 2008, Nowcom 솔류션 개발팀

winmm.lib 를 별도로 링크해야 하므로 사용이 약간 불편

특정한 시점 단위 사이의 시간을 측정하는 용도에 적합

오버헤드 대비 정밀도는 가장 뛰어남

정밀도 조절을 통해 ms 단위의 정밀도 조정 가능

하드웨어적인 제약이 있으며, 일반적으로 게임 등에 자주 사용됨

10.5. QueryPerformanceCounter()

특정한 시점 단위 사이의 시간을 측정하는 용도에 적합

ms 이하의 정밀도까지 보장할 수 있으므로 정밀도는 매우 높음

하드웨어적인 제약이 크고, 가장 부하가 큼

높은 정밀도를 요구하는 실시간 장비나 게임 등에 자주 사용됨

오버헤드가 높아 잦은 시간체크를 요구하는 시스템에서는 사용에 주의해야 함

11. 참고 서적 및 인터넷 사이트

http://blog.naver.com/fantajeon?Redirect=Log&logNo=80002530368http://cafe.naver.com/cafec.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=11646

21