|
INtime
Tech
INtime Top
ó¸®
½Ã°£ÀÇ °èÃø
°èÃø
¼ö´Ü 1. INscope À¯Æ¿¸®Æ¼·Î °èÃø
°èÃø
¼ö´Ü 2. ¹Ð¸® ¼¼ÄÁµå Á¤µµ·ÎÀÇ Ã³¸® ½Ã°£ °èÃø
°èÃø
¼ö´Ü 3. ³ª³ëÃÊÁ¤µµ·ÎÀÇ Ã³¸® ½Ã°£ °èÃø
°èÃø
¼ö´Ü 4. ¿ÜºÎ ½ÅÈ£ Ãâ·Â°ú ÃøÁ¤±â¿¡ ÀÇÇÑ Ã³¸® ½Ã°£ °èÃø
CPU
Ŭ¶ô Ä«¿îÅ͸¦ °èÃø¿¡ ÀÌ¿ëÇÒ ¼ö ¾ø´Â CPU¿¡ ´ëÇØ
»ùÇà ÄÚµå
°èÃø
¼ö´Ü 1. INscope À¯Æ¿¸®Æ¼·Î °èÃø
ºÎ¼ÓµÇ´Â INscope À¯Æ¿¸®Æ¼¿¡¼´Â, RT½º·¹µåÀÇ µ¿ÀÛ
ŸÀ̹ÖÀ̳ª ó¸® ½Ã°£À» ±×·¡ÇÇÄÃÇÏ°Ô ¼öÁý·°èÃøÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ±â´ÉÀ» ÀÌ¿ëÇϱâ À§Çؼ´Â Ç×»ó ÀÏÁ¤ÇÑ CPU Ŭ¶ôÀÌ °ø±ÞµÇ°í ÀÖ´Â °ÍÀÌ ÀüÁ¦°¡
µÇ±â À§ÇØ SpeedStep ±â´ÉÀ» °¡Áö´Â ÄÄÇ»ÅÍ¿¡¼´Â ¿Ã¹Ù¸¥ °èÃøÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù

°íµµÀÇ ÀÌ¿ë ¹æ¹ýÀ¸·Î¼
¾îÇø®ÄÉÀÌ¼Ç Äڵ忡 INscope API¸¦ ¹¯´Â °Í¿¡ ÀÇÇØ¼ INscopeÀÇ Æ®·¹À̽º °á°ú¿¡ À̺¥Æ® ¸¶Å©¸¦ ³²±æ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ¹æ¹ýÀ»
»ç¿ëÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÕ´Ï´Ù.
- ó¸® ½Ã°£À» °èÃøÇÏ°í ½ÍÀº ¾îÇø®ÄÉÀ̼Ç
Äڵ忡#include <traceapi.h>¸¦ µ¡ºÙ¿© ¾¸ ÇÕ´Ï´Ù. ÀÌ Çì´õ ÆÄÀÏÀº
<INtimeInstallPath>\rt\include¿¡ ÀÖ½À´Ï´Ù.¾îÇø®ÄÉÀ̼ÇÀÇ ÇÁ·ÎÁ§Æ®¿¡ traceapi.lib¸¦
¸µÅ©Çϵµ·Ï ÇÕ´Ï´Ù. ÀÌ ¶óÀ̺귯¸® ÆÄÀÏÀº <INtimeInstallPath>\rt\lib¿¡ ÀÖ½À´Ï´Ù.
- INscopeÀÇ Æ®·¹À̽º °á°ú¿¡ ¸¶Å©¸¦ ³²±â°í ½ÍÀº ¿ø½Ã
ÄÚµåÀåÀÇ À§Ä¡¿¡, log_RT_event( '1' , 0 ); (¿Í)°ú °°ÀÌ µ¡ºÙ¿© ¾¸´Ï´Ù. ¹®ÀÚ(¿¹¿¡¼´Â'1')´Â ÀÓÀÇ·Î ÁöÁ¤ °¡´ÉÇϰí
Æ®·¹À̽º °á°ú¿¡ »ç¿ëµË´Ï´Ù.
- ºôµå ÇÑ ¾îÇø®ÄÉÀ̼ÇÀ» ½ÇÇàÇØ, INscope·Î
Æ®·¹À̽º¸¦ °³½ÃÇϸé ÁöÁ¤ÇÑ ¸¶Å©°¡ ±â·ÏµË´Ï´Ù.
°ü·Ã Á¤º¸
µð¹ö°Å¿¡
´ëÇØ #INscope
°èÃø ¼ö´Ü 2. ¹Ð¸® ¼¼ÄÁµå Á¤µµ·ÎÀÇ Ã³¸® ½Ã°£
°èÃø
¹Ð¸® ¼¼ÄÁµå Á¦µµÀÇ °èÃø¿¡´Â INtime ½Ã½ºÅÛ ÄÝ,knGetKernelTime(
)ÀÌ À¯È¿ÇÕ´Ï´Ù.ÀÌ ÄÝÀº INtime Ä¿³ÎƽÀÌ ¹ß»ýÇÒ ¶§¸¶´Ù ÀÎÅ©¸®¸ÕÆ®(increment) µÇ´Â 64 bit Ä«¿îÅÍÄ¡¸¦ ²¨³¾
¼ö ÀÖ½À´Ï´Ù. ´Ù¸¸ Ä¿³Îƽ ÁÖ±â´Â À籸¼º °¡´ÉÇϱ⠶§¹®¿¡, ÇöÀçÀÇ Ä¿³Îƽ ¼³Á¤Ä¡´ÂCopyRtSystemInfo(
)¿¡ ÀÇÇØ¼ ¹Ì¸® ¾ò½À´Ï´Ù. ¹Ð¸® ¼¼ÄÁµå~ÃÊÁ¤µµÀÇ °èÃø¿¡´Â INtime ½Ã½ºÅÛ ÄÝ,
knGetKernelTime( )ÀÌ À¯È¿ÇÕ´Ï´Ù. ÀÌ ÄÝÀº INtime Ä¿³ÎƽÀÌ ¹ß»ýÇÒ ¶§¸¶´Ù ÀÎÅ©¸®¸ÕÆ®(increment) µÇ´Â 64 bit
Ä«¿îÅÍÄ¡¸¦ ²¨³¾ ¼ö Àֱ⠶§¹®¿¡, ¼Ò¿äÇÑ Ä¿³Îƽ¼ö·ÎºÎÅÍ Ã³¸®¿¡ °É¸®´Â ½Ã°£À» ¿ä±¸ÇÕ´Ï´Ù. Ä¿³Îƽ ½Ã°£ ÀÌÇÏÀÇ °èÃøÀº ÇÒ ¼ö ¾ø´Â Á¡¿¡ ÁÖÀǰ¡
ÇÊ¿äÇÕ´Ï´Ù. ¶Ç Ä¿³Îƽ ½Ã°£Àº À籸¼º °¡´ÉÇϱ⠶§¹®¿¡, Ä¿³Îƽ °³¼ö·ÎºÎÅÍ ±¸ÇÒ ¼ö ÀÖ´Â ½Ã°£Àº Çϳª Á¤µµ°¡ ¾Æ´Ñ °Í¿¡ ÁÖÀÇÇÕ´Ï´Ù. ÇöÀçÀÇ
Ä¿³Îƽ¼³Á¤Ä¡´Â CopyRtSystemInfo( )¿¡ ÀÇÇØ¼ ¿ä±¸ÇÒ ¼ö ÀÖ½À´Ï´Ù.
SYSINFO sysinfo;
DWORD dwKtickInUsecs ,dwKtickInMsecs;
QWORD qStart, qEnd ,qDiff;
// Àú·¹º§Æ½Ä¡(¸¶ÀÌÅ©·Î ¼¼ÄÁµå ´ÜÀ§)¸¦ ÃëµæÇÕ´Ï´Ù
CopyRtSystemInfo(&sysinfo);
dwKtickInUsecs = 10000 / sysinfo.KernelTickRatio;
dwKtickInMsecs = 1000 / dwKtickInUsecs;
printf( "%dticks/ms\n" ,dwKtickInMsecs );
// ó¸® °³½Ã½Ã°¢ÀÇ Ãëµæ
knGetKernelTime( (LPKNTIME) &qStart );
ToDo( );
// ó¸® Á¾·á½Ã°¢ÀÇ Ãëµæ
knGetKernelTime( (LPKNTIME) &qEnd );
// ó¸® ½Ã°£ÀÇ »êÃâ(ms´ÜÀ§)
qDiff = (qEnd - qStart) / dwKtickInMsecs;
°èÃø ¼ö´Ü 3. ³ª³ëÃÊÁ¤µµ·ÎÀÇ Ã³¸® ½Ã°£ °èÃø
Pentium CPU°¡ ³»ºÎ¿¡ °¡Áö´Â 64 bitÀÇ ÆÛÆ÷¸Õ½º
Ä«¿îÅÍ ·¹Áö½ºÅÍ(ŸÀÓ ½ºÅÆÇÁ Ä«¿îÅÍ)¸¦ ÀÌ¿ëÇϸé, ³ª³ëÃÊÁ¤µµ·ÎÀÇ °èÃøµµ °¡´ÉÇÕ´Ï´Ù. ÀÌ ¹æ¹ýÀº °èÃø
¼ö´Ü 1¿¡¼µµ ÀÌ¿ëµÇ°í ÀÖ´Â ¹æ¹ýÀÔ´Ï´Ù. ÀÌ ±â´ÉÀ» ÀÌ¿ëÇϱâ À§Çؼ´Â Ç×»ó ÀÏÁ¤ÇÑ CPU Ŭ¶ôÀÌ °ø±ÞµÇ°í ÀÖ´Â °ÍÀÌ ÀüÁ¦°¡ µÇ¹Ç·Î
SpeedStep ±â´ÉÀ» °¡Áö´Â ÄÄÇ»ÅÍ¿¡¼´Â ¿Ã¹Ù¸¥ °èÃøÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù
// CPU Ŭ¶ô Ä«¿îÅÍÀÇ Ãëµæ(SpeedStep ±â´ÉÀÌ ÀÖ´Â CPU¿¡¼´Â ÀÌ¿ëÇÒ ¼ö ¾ø½À´Ï´Ù)
_int64 GetPentiumCounter(void)
{
_asm rdtsc
}
// CPU ¼ÓµµÀÇ °èÃø( Hz )
DWORD GetCPUSpeed(void)
{
_int64 start ,end ,def;
RtSleep( 10 );
start = GetPentiumCounter();
RtSleep( 100 );
end = GetPentiumCounter();
def = end - start ;
return( (DWORD) def * 10 );
}
// ó¸® ½Ã°£ÀÇ »êÃâ( nano second )
double CalcTime( _int64 start ,_int64 end ,double clk )
{
return ((double)(end - start) * clk);
}
/*****************************************************************************
*
* FUNCTION: main
*
*****************************************************************************/
void main(void)
{
_int64 start ,end;
DWORD cpuHz;
double clk;
// ÇöÀçÀÇ CPU ¼Óµµ
cpuHz = GetCPUSpeed();
clk = (double) 1000000000 / (double) cpuHz;
printf("CPU speed is %.1f Hz\n" ,(float) cpuHz );
printf("clk is %.10f nano second\n" ,clk );
// ó¸® ½Ã°£ÀÇ °èÃø
start = GetPentiumCounter();
ToDo();
end = GetPentiumCounter();
// ó¸® ½Ã°£ÀÇ »êÃâ·Ç¥½Ã
printf( "ó¸® ½Ã°£ = %.5f(ns) \n" ,CalcTime( start ,end ,clk ) );
}
»ùÇà ÄÚµå
|