程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 計算程序運行時間的方法

計算程序運行時間的方法

編輯:關於C語言

1

這個是windows裡面常用來計算程序運行時間的函數;
DWORD dwStart = GetTickCount();
//這裡運行你的程序代碼
DWORD dwEnd = GetTickCount();
則(dwEnd-dwStart)就是你的程序運行時間, 以毫秒為單位
這個函數只精確到55ms,1個tick就是55ms。

#include <iostream>
#include <windows.h>
using namespace std;
int main(int argc, char* argv[])
{
DWORD start, end;

start = GetTickCount();
for(int i=0;i<1000;i++)
cout<<"you are a good child!"<<endl;   //your code
end = GetTickCount()-start;
cout<<end<<endl;
    return 0;
}

2
timeGetTime()基本等於GetTickCount(),但是精度更高
DWORD dwStart = timeGetTime();

//這裡運行你的程序代碼

DWORD dwEnd = timeGetTime();

則(dwEnd-dwStart)就是你的程序運行時間, 以毫秒為單位
雖然返回的值單位應該是ms,但傳說精度只有10ms。

#include <iostream>
#include <windows.h>
#pragma comment(lib,"winmm.lib")

using namespace std;
int main(int argc, char* argv[])
{
DWORD start, end;

start = timeGetTime();
for(int i=0;i<100;i++)
cout<<"you are a good child!"<<endl;
end = timeGetTime()-start;
cout<<end<<endl;
    return 0;
}

3
用clock()函數,得到系統啟動以後的毫秒級時間,然後除以CLOCKS_PER_SEC,就可以換成“秒”,標准c函數。
clock_t clock ( void );

#include <time.h>
clock_t t = clock();
long sec = t / CLOCKS_PER_SEC;
他是記錄時鐘周期的,實現看來不會很精確,需要試驗驗證;

4
#include<iostream>
#include<ctime> //<time.h>
using   namespace   std;
int   main()
{
    time_t   begin,end;

    double duration;
    begin=clock();
    //這裡加上你的代碼
    end=clock();

    duration=double(end-begin)/CLOCKS_PER_SEC;
    cout<<"runtime:   "<<duration<<endl;
}

5
unix時間相關,也是標准庫的
這些在<time.h>
1.timegm函數只是將struct tm結構轉成time_t結構,不使用時區信息;
time_t timegm(struct tm *tm);

2.mktime使用時區信息
time_t mktime(struct tm *tm);

timelocal 函數是GNU擴展的與posix函數mktime相當
time_t timelocal (struct tm *tm);

3.gmtime函數只是將time_t結構轉成struct tm結構,不使用時區信息;
struct tm * gmtime(const time_t *clock);

4.localtime使用時區信息
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.文件的修改時間等信息全部采用GMT時間存放,不同的系統在得到修改時間後通過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 = t1.wMilliseconds;

SYSTEMTIME sysTm;
::GetLocalTime(&sysTm);


在time.h中的_strtime() //只能在windows中用
char t[11];
_strtime(t);
puts(t);

6
下面是轉的一個用匯編的精確計時方法
---------------------------------------------------------------------------------------
如何獲得程序或者一段代碼運行的時間?你可能說有專門的程序測試工具,確實,不過你也可以在程序中嵌入匯編代碼來實現。

在Pentium的指令系統中有一條指令可以獲得CPU內部64位計數器的值,我們可以通過代碼兩次獲取該計數器的值而獲得程序或代碼運行的時鐘周期數,進而通過你的cpu的頻率算出一個時鐘周期的時間,從而算出程序運行的確切時間。

我們通過指令TDSIC來獲得cpu內部計數器的值,指令TDSIC返回值放在EDX:EAX中,其中EDX中存放64位寄存器中高32位的值,EAX存放第32位的值.

下面看看實現的代碼:

//用匯編實現獲取一段代碼運行的時間
#include<iostream>

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以上 ^_^
cout<< (double) (timer /1.1/1000000000) << endl;
return 0;
}


   這樣通過一條簡單的匯編指令就可以獲得程序或一段代碼的大概時間,不過並不能得到運行的確切時間,因為即使去掉中間的循環,程序也會有個運行時間,

因為在第一次取得計數器的值後,有兩條匯編指令mov HighStart, edx    mov LowStart, eax這兩條指令當然也有運行時間 ,當然你可以減去這兩條指令的運行時間(在1.1G的機子上是3e-8s),這樣會更精確一點。

如果你要確切知道程序的運行時間,測試軟件肯定會更好一點,不過好像一般沒有必要獲取除非專門的要求的程序。

不過能DIY一個也是不錯的,不管有沒有,最起碼你可以學到在VC++中如何嵌入匯編代碼以及如何使用32位的寄存器,其實和16位的寄存器一樣使用,將來64的也應該一樣,只不過位數不同罷了

 專業的作者“brucema的博客”
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved