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.0239 sec