2024年2月7日发(作者:)
C++获取代码运行时间
如何获取代码运行时间在调试中,经常需要计算某一段代码的执行时间,下面给出两 种常用的方式:
第一种:使用 GetTickCount 函数
#include
#include
int main()
{
DWORD start_time=GetTickCount();
{// 此处为被测试代码
}
DWORD end_time=GetTickCount();
cout<<"The run time is:"<<(end_time-start_time)<<"ms!"< } GetTickCount函数返回从系统运行到现在所经历的时间 (类型为DWORD),单位为ms,因为 DWORD表示范围的限制,所以使用此种方法存在限制,即系统的运行时间的 超出DWORD的表示范围。 ms表示不能 第二种:使用 clock() 函数 #include #include int main() { clock_t start_time=clock(); { // 被测试代码 }clock_t end_time=clock(); cout<< 间 return 0; } clock_t,clock()定义于time.h中,clock ()返回从程序运行时刻开始的时钟周期数,类型为 _PER_SEC义了每秒钟包含多少了时钟单元数,因为计算 由上面分析可知,用 clock()函数计算运行时间,表示范围一定大于 所以,建议使用 clock()函数。 1.使用 CTime 类 CString str; ms,所以*1000。 GetTickCount ()函数, "Running time is: "< // 获取系统时间 CTime tm; tm=CTime::GetCurrentTime(); str=(” 现在时间是 %Y年%m 月 %d 日 %X"); MessageBox(str,NULL,MB_OK); 2: 得到系统时间日期 (使用 GetLocalTime) SYSTEMTIME st; CString strDate,strTime; GetLocalTime(&st); ("%4d-%2d-%2d",,,); ("%2d:%2d:%2d",,e,d); 3. 使用 GetTickCount // 获取程序运行时间 long t1=GetTickCount();// 程序段开始前取得系统运行时间 (ms) Sleep(500); long t2=GetTickCount();();// 程序段结束后取得系统运行时间 (ms) ("time:%dms",t2-t1);// 前后之差即 程序运行时间 AfxMessageBox(str); // 获取系统运行时间 long t=GetTickCount(); CString str,str1; ("系统已运行 %d 时”,t/3600000); str=str1; t%=3600000; ("%d 分",t/60000); str+=str1; t%=60000; ("%d 秒 ”,t/1000); str+=str1; AfxMessageBox(str); 如何在VC6.0中得到一个程序的运行时间,也就是这个程序耗费的时钟周期数 时间编程 #include #include using namespace std; int main() { time_t begin,end; begin=clock(); // 这里加上你的代码 end=clock(); cout<<"runtime: "< } unix 时间相关 ,也是标准库的 这些在 / C和C++的 函数只是将 struct tm 结构转成 time_t 结构 ,不使用时区信息 ; time_t timegm(struct tm *tm); 使用时区信息 time_t mktime(struct tm *tm); timelocal 函数是 GNU 扩展的与 posix 函数 mktime 相当 time_t timelocal (struct tm *tm); 函数只是将time_t结构转成struct tm结构,不使用时区信息; struct tm * gmtime(const time_t *clock); ime 使用时区信息 struct tm * localtime(const time_t *clock); 1. time 获取时间, stime 设置时间 time_t t ; t = time(&t); 2. stime 其参数应该是 GMT 时间 ,根据本地时区设置为本地时间 ; int stime(time_t *tp) 3. UTC=true 表示采用夏时制 ; 4. 文件的修改时间等信息全部采用 localtime 转换成本地时间 ; 5. 设置时区推荐使用 setup来设置; 6. 设 置 时 区 也 可 以 先 更 变 /etc/sysconfig/clock 中 的 设 置 再 将 ln -fs /usr/share/zoneinfo/xxxx/xxx /etc/localtime 才能重效 time_t 只能表示 68 年的范围,即 mktime 只能返回 1970-2038 这一段范围的 time_t 看看你的系统是否有 time_t64 ,它能表示更大的时间范围 Window 里面的一些不一样的 CTime MFC类,好像就是把time.h封了个类,没扩展 CTime t = GetCurrentTime(); SYSTEMTIME结构包含毫秒信息 typedef struct _SYSTEMTIME { WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; } SYSTEMTIME, *PSYSTEMTIME; SYSTEMTIME t1; GetSystemTime(&t1) CTime curTime(t1); WORD ms = seconds; SYSTEMTIME sysTm; GMT 时间存放 ,不同的系统在得到修改时间后通过 ::GetLocalTime(&sysTm); 在 time.h 中的 _strtime() // 只能在 windows 中用 char t[11]; _strtime(t); puts(t); _timeb 定义在 SYS'TIMEB.H 有四个 fields dstflag millitm time timezone void _ftime( struct _timeb *timeptr ); struct _timeb timebuffer; _ftime( &timebuffer ); 取当前时间:文档讲可以到 ms,有人测试,好象只能到16ms! 如何设定当前系统时间 ---windows SYSTEMTIME m_myLocalTime,*lpSystemTime; m_=2003; m_=1; m_=1; m_=0; m_e=0; m_d=0; m_seconds=0; lpSystemTime=&m_myLocalTime; if( SetLocalTime(lpSystemTime) ) // 此处换成 SetSystemTime( )也不行 MessageBox("OK !"); else MessageBox("Error !"); SYSTEMTIME m_myLocalTime,*lpSystemTime; m_=2003; m_=1; m_=1; lpSystemTime=&m_myLocalTime; if( SetDate(lpSystemTime) ) // 此处换成 SetSystemTime( )也不行 MessageBox("OK !"); else MessageBox("Error !"); 用clock()函数,得到系统启动以后的毫秒级时间,然后除以 秒”标准c函数。 CLOCKS_PER_SEC就可以换成 clock_t clock ( void ); #include clock_t t = clock(); long sec = t / CLOCKS_PER_SEC; 他是记录时钟周期的,实现看来不会很精确,需要试验验证; 据说 tc2.0 的 time 结构含有毫秒信息 #include #include int main(void) { struct time t; gettime(&t); printf("The current time is: %2d:%02d:%02d.%02dn", _hour, _min, _sec, _hund); return 0; } time 是一个结构体, , 其中成员函数 ti_hund 是豪秒。。。上程序可以在 tc2.0 运行 这个是 windows 里面常用来计算程序运行时间的函数; DWORD dwStart = GetTickCount(); // 这里运行你的程序代码 DWORD dwEnd = GetTickCount(); 则(dwEnd-dwStart)就是你的程序运行时间,以毫秒为单位 这个函数只精确到 55ms, 1 个 tick 就是 55ms。 timeGetTime()基本等于GetTickCount(),但是精度更高 DWORD dwStart = timeGetTime(); // 这里运行你的程序代码 DWORD dwEnd = timeGetTime(); 则(dwEnd-dwStart)就是你的程序运行时间,以毫秒为单位 虽然返回的值单位应该是 ms,但传说精度只有10ms。 Borland C++ Builder VCL 的时间函数 1. Date 返回 TDateTime 对象 ,包含当前的年月日信息 ,函数原型如下: System:: TDateTime __fastcall Date(void) ; 2. Time 返回 TDateTime 对象 ,包含当前的时间信息 ,函数原型如下: System:: TDateTime __fastcall Time(void) ; 3. Now 返回 TDateTime 对象 ,获取当前的日期和时间信息 ,函数原型如下: System:: TDateTime __fastcall Now(void) ; 4. DatetimeToString 将 TDateTime 对象转换为指定格式的字符串对象 , 函数原型如下: void __fastcall DateTimeToString(AnsiString &; Result, const AnsiString Format,System:: TDateTime DateTime) ; 5. DateToStr 将 TDateTime 对象 (包含当前年月日信息 ) 转换为字符串对象 ,函数原型如下: AnsiString __fastcall DateToStr(System::TDateTime Date) ; 6. TimeToStr 将当前日期转换为字符串对象 ,函数原型如下: AnsiString __fastcall TimeToStr(System:: TDateTime Time) ; 7. DateTimetoStr 将 TDateTime 对象转换为字符串对象 ,函数原型如下: AnsiString __fastcall DateTimeToStr(System:: TDateTime DateTime) ; 8. StrToDate 将字符串对象转换为年月日对象 ,函数原型如下: System:: TDateTime __fastcall StrToDate(const AnsiString S); 9. StrToTime 将字符串对象转换时间对象 ,函数原型如下: System:: TDateTime __fastcall StrToTime(const AnsiString S); ateTime 将字符串对象转换为年月日时间对象 ,函数原型如下: System:: TDateTime __fastcall StrToDateTime(const AnsiString S) ; meToSystemTime 将 TDateTime 对象转换为操作系统时间 ,函数原型如下: void __fastcall DateTimeToSystemTime(System :: TDateTime DateTime, _SYSTEMTIME &; SystemTime); TimeToDateTime 将操作系统时间转换为 TDateTime 对象 ,函数原型如下: System :: TDateTime __fastcall SystemTimeToDateTime(const _SYSTEMTIME & ; SystemTime); 面是转的一个用汇编的精确计时方法 如何获得程序或者一段代码运行的时间?你可能说有专门的程序测试工具, 可以在程序中嵌入汇编代码来实现。 在 Pentium 的指令系统中有一条指令可以获得 CPU 内部 64 位计数器的值,我们可以通过代 码两次获取该计数器的值而获得程序或代码运行的时钟周期数, 进而通过你的 cpu 的频率算 出一个时钟周期的时间,从而算出程序运行的确切时间。 我们通过指令TDSIC来获得cpu内部计数器的值,指令TDSIC返回值放在EDX:EAX中,其中EDX 中存放64位寄存器中高32位的值,EAX存放第32位的值. 下面看看实现的代码 : // 用汇编实现获取一段代码运行的时间 #include using namespace std; void GetClockNumber (long high, long low); void GetRunTime(); int main() {确实, 不过你也 long HighStart,LowStart,HighEnd,LowEnd; long numhigh,numlow; // 获取代码运行开始时 cpu 内部计数器的值 __asm { RDTSC mov HighStart, edx mov LowStart, eax } for(int i= 0; i<100000; i++ ) {for(int i= 0; i<100000; i++ ) { }} // 获取代码结束时 cpu 内部计数器的值,并减去初值 __asm { RDTSC mov HighEnd, edx Mov LowEnd, eax ;获取两次计数器值得差 sub eax, LowStart cmp eax, 0 ; 如果低 32 的差为负则求返 ,因为第二次取得永远比第一次的大 jg L1 neg eax jmp L2 L1: mov numlow, eax L2: sbb edx, HighStart mov numhigh, edx } // 把两个计数器值之差放在一个 64 位的整形变量中 // 先把高 32 位左移 32 位放在 64 的整形变量中 ,然后再加上低 32 位 __int64 timer =(numhigh<<32) + numlow; // 输出代码段运行的时钟周期数 // 以频率 1.1Gcpu 为例 ,如果换计算机把其中的 1.1 改乘其它即可 ,因为相信大家的 cpu 都应 该在1G以上A_A cout<< (double) (timer /1.1 /1000000000) << endl; return 0; } 这样通过一条简单的汇编指令就可以获得程序或一段代码的大概时间, 不过并不能得到运 行的确切时间,因为即使去掉中间的循环,程序也会有个运行时间, 因为在第一次取得计数器的值后, 有两条汇编指令 mov HighStart, edx mov LowStart, eax 这两 条指令当然也有运行时间 ,当然你可以减去这两条指令的运行时间 3e-8s),这样会更精确一点。 如果你要确切知道程序的运行时间, 专业的测试软件肯定会更好一点, 不过好像一般没有必 要获取除非专门的要求的程序。 不过能DIY —个也是不错的,不管有没有,最起码你可以学到在 VC++中如何嵌入汇编代码 以及如何使用 32 位的寄存器,其实和 16位的寄存器一样使用,将来 64 的也应该一样,只 不过位数不同罢 (在 1.1G 的机子上是


发布评论