E D R , A S I H C RSS

Performance Test

”„กœ๊ทธžจ˜ „ฑŠฅ„ ธก ••˜Š” ฐฉ•. ”„กœ๊ทธžจ‚˜ •Œ๊ณ ฆฌฆ˜˜ „ฑŠฅ„ •Œ•„Š” ฐฉ•ค‘ •˜‚˜๊ฐ€ ˆ˜–‰‹œ๊ฐ„ ธก •ž…‹ˆ‹ค.

HighResolutionTimer ‚ฌšฉ•˜๊ธฐ

Windows —„œ˜ ˆ˜–‰‹œ๊ฐ„ธก • ฐฉ•.
~cpp 
 BOOL QueryPerformanceFrequency(LARGE_INTEGER* param)
 BOOL QueryPerformanceCounter(LARGE_INTEGER* param)
ƒ๊ธฐ ‘ Windows API•ˆ˜ฅผ ‚ฌšฉ•„œ ˆ˜–‰ ‹œ๊ฐ„„ ธก • •  ˆ˜ žˆŠต‹ˆ‹ค.

˜ˆ œ

ˆ˜–‰‹œ๊ฐ„ ธก •šฉ C++ Class. ˆ˜–‰‹œ๊ฐ„ ‹จœ„Š” Sec ž…‹ˆ‹ค. ‹จ HighResolutionTimerฅผ €›•˜Š” ”„กœ„ธ„œ๊ฐ€ •„𔕋ˆ‹ค.
‹คŒ€ Binary Search ˜ ผฌจผŠค ธก •€ จ ˜ˆ œ. CTimeEstimate ž˜Šคฅผ งŒ“ค– ”‹ˆ‹ค.
~cpp 
 #include <windows.h>
 #include <time.h>
 #include <stdio.h>

 class CTimeEstimate
 {
 protected:
	__int64 m_nStart, m_nEnd, m_nFreq;

 public:
 	CTimeEstimate () {
                  m_nStart = m_nEnd = m_nFreq = 0;
                  QueryPerformanceFrequency((LARGE_INTEGER*)&m_nFreq);
         }

 	~CTimeEstimate () {   }

 	void Start () {
 		QueryPerformanceCounter((LARGE_INTEGER*)&m_nStart);
 	}

 	void End () {
 		QueryPerformanceCounter((LARGE_INTEGER*)&m_nEnd);
 	}

 	double Result () {
 		return (double)(m_nEnd - m_nStart)/m_nFreq;
 	}
 };

 void Init (int S[]);
 int getRandNum (int nBoundary);
 int BinarySearch (int nBoundary, int S[], int nKey);

 int main (void)
 {
 	CTimeEstimate est;

 	int S[30001];
 	int i, nRandNum, nLocation;
 	int nBoundary = 2000;

 	Init (S);
 	nRandNum = getRandNum (nBoundary);

 	est.Start ();
 	for (i=0;i<1000;i++) {
 		nLocation = BinarySearch (nBoundary, S, nRandNum);
 	}
 	est.End ();

 	// result
 	printf ("random number : %d \n", nRandNum);
 	printf ("location : %d\n", nLocation);
 	printf ("estimated time : %f \n", est.Result ());

 	return 0;
 }

 void Init (int S[]) {
 	for (int i=1;i<30001;i++) {
 		S[i] = i;
 	}
 }

 int getRandNum (int nBoundary) {
 	time_t t;

 	t = time (NULL);
 	srand (t);

 	return rand () % nBoundary;
 }

 int BinarySearch (int nBoundary, int S[], int nKey)
 {
 	int nBoundaryLow, nBoundaryHigh, nMiddleKey;
 	nBoundaryLow = 1; nBoundaryHigh = nBoundary;

 	while ((nBoundaryLow <= nBoundaryHigh) && nMiddleKey) {
 		nMiddleKey = (nBoundaryLow + nBoundaryHigh) / 2;

 		if (nKey == S[nMiddleKey])
 			return nMiddleKey;
 		else if (nKey < S[nMiddleKey])
 			nBoundaryHigh = nMiddleKey - 1;
 		else
 			nBoundaryLow = nMiddleKey + 1;
 	}

 	return FALSE;
 }

ftime•ˆ˜, timeb ๊ตฌกฐ˜ ‚ฌšฉ

น„๊ต  CPU™€ OS— ˜ € •Š€ ฐฉ•œผกœŠ” ftime •ˆ˜™€ timeb ๊ตฌกฐฅผ ‚ฌšฉ•˜Š” ฐฉ• žˆŠต‹ˆ‹ค. €ฆฌ„ธ“œ ‹จœ„๊นŒ€ ฐ–—  œ๊ณต˜€ •ŠŠต‹ˆ‹ค. sys/timeb.h —ค”—  •˜œ ‚šฉ ANSI C Š” •„‹ˆผ๊ณ  •Œ๊ณ žˆŠต‹ˆ‹ค.

ftime •ˆ˜˜ ”„กœ† ƒ€ž…

~cpp 
 void ftime(struct timeb* buf)

timeb ๊ตฌกฐ

~cpp 
 struct timeb {
  long time ;      /* seconds since 00:00:00, 1/1/70, GMT */
  short millitm ;  /* fraction of second  (in milliseconds) */
  short timezone ; /* difference between local time and GMT */
  short dstflag ;  /* 0 if daylight savings time is not in effect */
 };

ftime •ˆ˜™€ timeb ๊ตฌกฐ ‚ฌšฉ ˜ˆ

~cpp 
 #include <sys/timeb.h>
 #include <stdio.h>

 void show_est(struct timeb start, struct timeb end);

 int main(void)
 {
    struct timeb start, end;
    ftime(&start);
    sleep(1);
    ftime(&end);
    show_est(start,end);
 }

 void show_est(struct timeb start, struct timeb end)
 {
    int time, millitm;
    time = (int)(end.time - start.time);
    millitm = (int)(end.millitm - start.millitm);
    if (millitm<0)
    {
       time --;
       millitm += 1000;
    }
    printf (" %d ms ๊ฑธ ธŠต‹ˆ‹ค.\n",time*1000+millitm);
 }

RDTSC ˜ ‚ฌšฉ

งˆฌกœ †Œ”„Šธ›จ– 1999…„ 2›”˜ธ …Œฌ‹ˆŸผ— ‚˜˜จ ฐฉ•ž…‹ˆ‹ค.
Žœ‹ฐ—„ ƒ˜ CPU—„œ RDTSC(Read from Time Stamp Counter)ฅผ šฉ•˜Š” ฐฉ• žˆ‹ค. Žœ‹ฐ—„€ ‚€ œผกœ TSC(Time Stamp Counter)ผŠ” 64น„Šธ š„ฐฅผ ๊ฐ€€๊ณ  žˆŠ”ฐ  š„ฐ˜ ๊ฐ’€ Ÿญ ‚ฌงˆ‹ค ฆ๊ฐ€•œ‹ค. RDTSCŠ” ‚€ TSCš„ฐ˜ ๊ฐ’„ EDX™€ EAX  ˆ€Šค„ฐ— ณต‚ฌ•˜Š” … น‹ค.  … น€ 6—„œ 11Ÿญ„ †Œš”•œ‹ค. Win32 API˜ QueryPerformanceCounter„  … น„ šฉ• ๊ตฌ˜„•œ ๊ฒƒœผกœ ถ”ธกœ‹ค. ธผธ –…ˆธ”Ÿฌฅผ ‚ฌšฉ•˜—ฌ ‹คŒ๊ณผ ๊ฐ™ ‚ฌšฉ•  ˆ˜ žˆ‹ค.
~cpp 
 #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}
๊ฐ„‹จ•˜๊ฒŒ 32น„Šธ  •ˆ˜กœ ‚ฌšฉ•˜๊ณ ž •œ‹ค RDTSC… น š„ฐ—„œ ๊ฐ€ ธ˜คŠ” ๊ฐ’ ค‘—„œ EAX— ‹๊ธ ๊ฐ’งŒ„ ๊ฐ€ ธ˜คŠ” ฐฉ• žˆ‹ค. งง€ ‹œ๊ฐ„™•ˆ ธก ••œ‹ค EAX— ‹๊ธ ๊ฐ’งŒ ๊ฐ€€๊ณ „ Ÿญ„ ธก ••  ˆ˜ žˆ‹ค. 64น„Šธฅผ ‘ šฉ•  ค LARGE_INTEGER ๊ตฌกฐฅผ šฉ•œ‹ค.
~cpp 
 LARGE_INTEGER start, end

 rdtscEx(start.LowPart, start.EndPart);
 ..... // ธก • ๊ตฌ๊ฐ„
 rdtscEx(end.LowPart, start.EndPart);

 elasped_time = *(__int64*)&end - *(__int64*)&start;
rdtscEx… น€ 36Ÿญ„ †Œš”•˜ฉฐ ธก • ๊ตฌ๊ฐ„„ Ÿญ ‹จœ„กœ ธก ••  ˆ˜ žˆŠ” ๊ฐ• ฅ•œ ‹œ๊ฐ„ ธก • ฐฉ•‹ค. •˜€งŒ  ฐฉ•€ Ÿญ ˆ˜งŒ ธก ••  ฟ ‹œ๊ฐ„„ •Œ ˆ˜Š” —†‹ค.  •™••œ ‹œ๊ฐ„„ •Œ ค ‹œŠค…œ˜ CPUŸญ„ •Œ•„••˜ฉฐ ธก ••œ Ÿญ๊ฐ’„ CPUŸญœผกœ ‚˜ˆ„–•‹œ๊ฐ„ ‚˜˜จ‹ค. RDTSC… น„ ˆ˜–‰•  •Œ CPU๊ฐ€ ˆ˜–‰ †„ –ฅƒ„ œ„•„œ CPU … น ˆœ„œ๊ฐ€ ฐ”€” ˆ˜ žˆ๊ธฐ •Œฌธ— CPUID… น„  „— ˆ˜–‰• … น ˆœ„œฅผ งžถฐ••˜Š” ๊ฒฝšฐ„ žˆ‹ค. ž„ธ•œ „ค…€ ธ…”—„œ  œ๊ณต•˜Š” „ฑŠฅ ‹ˆ„ฐง„ œ„•œ RDTSC … น ‚ฌšฉ•„ ฐธกฐ•˜๊ธฐ ฐ”ž€‹ค.


WindowsŠ” Multi-Threadกœ ™ž‘•˜€ •ŠŠต‹ˆ๊นŒ? œ„ ฝ”“œฅผ ˆ˜–‰•˜‹ค๊ฐ€ ‹คฅธ Threadกœ  œ–๊ฐ€ „˜–๊ฐ€๊ฒŒ ˜ ––๊ฒŒ  ๊นŒš”? •„งˆ ‹คฅธ Thread˜ ˆ˜–‰‹œ๊ฐ„๊นŒ€ คœผกœ ถ”๊ฐ€˜€ •Š„๊นŒš”? ”ฐผ„œ œ„—„œ ž‘„ฑ•˜‹  ฝ”“œ“ค€  •™••œ ˆ˜–‰‹œ๊ฐ„„ ธก ••˜€ •  ๊ฒƒ ๊ฐ™Šต‹ˆ‹ค. ๊ทธ ‡‹ค๊ณ   œ๊ฐ€  •™••œ ˆ˜–‰‹œ๊ฐ„ ธก •„ œ„•œ ฝ”“œ ž‘„ฑ ฐฉ•„ •Œ€Š” •‹ˆ‹ค. -_-;

‹จ,  •™••œ ˆ˜–‰‹œ๊ฐ„ ธก •„ œ„•„œผ  „ฌธ Profiling Tool„ šฉ• Š” ๊ฒƒ€ ––จ๊นŒš”? NuMega DPS ๊ฐ™€  œ’ˆ“ค€ ˆ˜–‰‹œ๊ฐ„ ธก •„ •„ฃผ Žธ•˜๊ฒŒ •  ˆ˜ žˆ๊ณ  ธก • ๊ฒฐ๊ณผ„ †ŒŠค ฝ”“œ  ˆฒจ๊นŒ€ €›• ค‹ˆ‹ค. งˆ†Œ €ก CD—„œ ‰๊ฐ€Œ„ ฐพ„ ˆ˜ žˆŠต‹ˆ‹ค. ‹จ, ‚ฌšฉ•˜‹ค •Œ Development Studio ๊ฐ€ กฐ๊ธˆ ง› ๊ฐˆ๊ฒ‹ˆ‹ค. ๊ฑฐ ‚˜ค‘— NuMega DPS €šฐ‹œ  •ƒœผกœ Œ•„๊ฐ‘‹ˆ‹ค. ๊ทธŸผ งŒ. -- '96 •„ฑˆ˜

p.s. NuMega  œ’ˆ“ค ––๊ฒŒ ˆ˜–‰‹œ๊ฐ„ ธก ••˜Š”€ •„‹œŠ” ถ„ ๊ธ€ € ˜ฌ คฃผ‹œฃ ?

€‹ฐ“ฐ ˆ“œกœ ธ•  œ–๊ถŒ „˜–๊ฐ€Š” ๊ฒƒ๊นŒ€ ๊ณ  ค•••œ‹ค ฐจผฆฌ „Šค ๊ฐ™€ ‹ฑ๊ธ€…ŒŠค‚น OS—„œ •Œ๊ณ ฆฌฆ˜ ˆ˜–‰‹œ๊ฐ„„ ๊ณ„‚ฐ•˜Š”๊ฒŒ ‚ซ€ •Š„๊นŒ •˜Š” ƒ๊ฐ„ •…‹ˆ‹ค. (•˜€งŒ, งŒผ TSR ”„กœ๊ทธžจ ๊ฐ™€ ๊ฒƒ ธ„ฐŸฝŠธ ๊ฐ€กœฑˆ‹ค —ญ‹œ งˆฐฌ๊ฐ€€ ฌธ œ๊ฐ€ ฐœƒ• “ฏ..) ๊ทธฆฌ๊ณ  ‹จˆœ•œ ”„กœ๊ทธžจ˜ ณ‘€ถ„„ ฐพ๊ธฐ œ„•œ ˆ˜–‰‹œ๊ฐ„ ๊ณ„‚ฐผ Visual C++ — žˆŠ” Profiler ฅผ ‚ฌšฉ•˜Š” ฐฉ•„ ๊œฐฎ„ ๊ฒƒ ๊ฐ™Šต‹ˆ‹ค. •‹น •ˆ˜“ค˜ ˆ˜–‰‹œ๊ฐ„“ค„ —ฌฃผ‹ˆ๊นŒš”.

NuMaga DPS Dev-Partner Studio ง”€ธ๊ฐ€ ฃ ? ( „— Bound Checker †ŒฌธงŒ “ค–„œ..~) --1002
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:24:00
Processing time 0.0177 sec