測試函式執行時間的8種方法——轉
目前,存在著各種計時函式,一般的處理都是先呼叫計時函式,記下當前時間tstart,然後處理一段程式,再呼叫計時函式,記下處理後的時間tend,再tend和tstart做差,就可以得到程式的執行時間,但是各種計時函式的精度不一樣.下面對各種計時函式,做些簡單記錄.
方法1,time()獲取當前的系統時間,返回的結果是一個time_t型別,其實就是一個大整數,其值表示從CUT(Coordinated Universal Time)時間1970年1月1日00:00:00(稱為UNIX系統的Epoch時間)到當前時刻的秒數.
void test1()
{
time_t start,stop;
start = time(NULL);
foo();//dosomething
stop = time(NULL);
printf("Use Time:%ld\n",(stop-start));
}
方法2,clock()函式返回從“開啟這個程式程序”到“程式中呼叫clock()函式”時之間的CPU時鐘計時單元(clock tick)數,在MSDN中稱之為掛鐘時間(wal-clock)
常量CLOCKS_PER_SEC,它用來表示一秒鐘會有多少個時鐘計時單元
void test2()
{
double dur;
clock_t start ,end;
start = clock();
foo();//dosomething
end = clock();
dur = (double)(end - start);
printf("Use Time:%f\n",(dur/CLOCKS_PER_SEC));
}
方法3,timeGetTime()函式以毫秒計的系統時間。該時間為從系統開啟算起所經過的時間,是windows api
void test3()
{
DWORD t1,t2;
t1 = timeGetTime();
foo();//dosomething
t2 = timeGetTime();
printf ("Use Time:%f\n",(t2-t1)*1.0/1000);
}
方法4,QueryPerformanceCounter()這個函式返回高精確度效能計數器的值,它可以以微妙為單位計時.但是QueryPerformanceCounter()確切的精確計時的最小單位是與系統有關的,所以,必須要查詢系統以得到QueryPerformanceCounter()返回的嘀噠聲的頻率.QueryPerformanceFrequency()提供了這個頻率值,返回每秒嘀噠聲的個數.
void test4()
{
LARGE_INTEGER t1,t2,tc;
QueryPerformanceFrequency(&tc);
QueryPerformanceCounter(&t1);
foo();//dosomething
QueryPerformanceCounter(&t2);
printf("Use Time:%f\n",(t2.QuadPart - t1.QuadPart)*1.0/tc.QuadPart);
}
方法5,GetTickCount返回(retrieve)從作業系統啟動到現在所經過(elapsed)的毫秒數,它的返回值是DWORD
void test5()
{
DWORD t1,t2;
t1 = GetTickCount();
foo();//dosomething
t2 = GetTickCount();
printf("Use Time:%f\n",(t2-t1)*1.0/1000);
}
方法6,RDTSC指令,在Intel Pentium以上級別的CPU中,有一個稱為“時間戳(Time Stamp)”的部件,它以64位無符號整型數的格式,記錄了自CPU上電以來所經過的時鐘週期數。由於目前的CPU主頻都非常高,因此這個部件可以達到納秒級的計時精度。這個精確性是上述幾種方法所無法比擬的.在Pentium以上的CPU中,提供了一條機器指令RDTSC(Read Time Stamp Counter)來讀取這個時間戳的數字,並將其儲存在EDX:EAX暫存器對中。由於EDX:EAX暫存器對恰好是Win32平臺下C++語言儲存函式返回值的暫存器,所以我們可以把這條指令看成是一個普通的函式呼叫,因為RDTSC不被C++的內嵌彙編器直接支援,所以我們要用_emit偽指令直接嵌入該指令的機器碼形式0X0F、0X31
inline unsigned __int64 GetCycleCount()
{
__asm
{
_emit 0x0F;
_emit 0x31;
}
}
void test6()
{
unsigned long t1,t2;
t1 = (unsigned long)GetCycleCount();
foo();//dosomething
t2 = (unsigned long)GetCycleCount();
printf("Use Time:%f\n",(t2 - t1)*1.0/FREQUENCY); //FREQUENCY指CPU的頻率
}
方法7,gettimeofday() linux環境下的計時函式,int gettimeofday ( struct timeval * tv , struct timezone * tz ),gettimeofday()會把目前的時間有tv所指的結構返回,當地時區的資訊則放到tz所指的結構中.
//timeval結構定義為:
struct timeval{
long tv_sec; /*秒*/
long tv_usec; /*微秒*/
};
//timezone 結構定義為:
struct timezone{
int tz_minuteswest; /*和Greenwich 時間差了多少分鐘*/
int tz_dsttime; /*日光節約時間的狀態*/
};
void test7()
{
struct timeval t1,t2;
double timeuse;
gettimeofday(&t1,NULL);
foo();
gettimeofday(&t2,NULL);
timeuse = t2.tv_sec - t1.tv_sec + (t2.tv_usec - t1.tv_usec)/1000000.0;
printf("Use Time:%f\n",timeuse);
}
方法8,linux環境下,用RDTSC指令計時.與方法6是一樣的.只不過在linux實現方式有點差異.
#if defined (__i386__)
static __inline__ unsigned long long GetCycleCount(void)
{
unsigned long long int x;
__asm__ volatile("rdtsc":"=A"(x));
return x;
}
#elif defined (__x86_64__)
static __inline__ unsigned long long GetCycleCount(void)
{
unsigned hi,lo;
__asm__ volatile("rdtsc":"=a"(lo),"=d"(hi));
return ((unsigned long long)lo)|(((unsigned long long)hi)<<32);
}
#endif
void test8()
{
unsigned long t1,t2;
t1 = (unsigned long)GetCycleCount();
foo();//dosomething
t2 = (unsigned long)GetCycleCount();
printf("Use Time:%f\n",(t2 - t1)*1.0/FREQUENCY); //FREQUENCY CPU的頻率
}
簡單的比較表格如下
總結,方法1,2,7,8可以在linux環境下執行,方法1,2,3,4,5,6可以在windows環境下執行.其中,timeGetTime()和GetTickCount()的返回值型別為DWORD,當統計的毫妙數過大時,將會使結果歸0,影響統計結果.
測試結果,windows環境下,主頻為1.6GHz,單位為秒.
1 Use Time:0
2 Use Time:0.390000
3 Use Time:0.388000
4 Use Time:0.394704
5 Use Time:0.407000
6 Use Time:0.398684
linux環境下,主頻為2.67GHz,單位為秒
1 Use Time:1
2 Use Time:0.290000
7 Use Time:0.288476
8 Use Time:0.297843
由於time()計時函式的精度比較低,多次執行程式時,將會得到不同的結果,時而為0,時而為1
foo()函式如下:
void foo()
{
long i;
for (i=0;i<100000000;i++)
{
long a= 0;
a = a+1;
}
}
相關推薦
測試函式執行時間的8種方法——轉
目前,存在著各種計時函式,一般的處理都是先呼叫計時函式,記下當前時間tstart,然後處理一段程式,再呼叫計時函式,記下處理後的時間tend,再tend和tstart做差,就可以得到程式的執行時間,但是各種計時函式的精度不一樣.下面對各種計時函式,做些簡單記錄.
用C/C++語言測試函式執行時間多種方法詳解
方法一:目前,存在著各種計時函式,一般的處理都是先呼叫計時函式,記下當前時間tstart,然後處理一段程式,再呼叫計時函式,記下處理後的時間tend,再tend和tstart做差,就可以得到程式的執行時間,但是各種計時函式的精度不一樣.下面對各種計時函式,做些簡
Linux下的函式執行時間的統計方法(測試某個函式的執行時間)
重點:一般用 通過gettimeofday函式:如何測試某個函式的執行時間是做實驗時經常用到的功能,在此比較Linux下的測試函式,主要是其精確度。我們採用統一的測試標準程式(standard.c): #include <stdio.h>#define MA
C++實現測試函式執行時間函式
使用方法: gettime(函式名,[要測試函式的引數,在0~3個範圍內],時間單位) // 時間單位如果不寫,預設為毫秒。 // 時間單位的格式: // ns 納秒 // us 微秒 // ms 毫秒 // s 秒 // min 分鐘 //
對CUDA核心函式執行時間測量的方法
方法一: cudaEvent_t start1; cudaEventCreate(&start1); cudaEvent_t stop1; cudaEventCreate(&stop1); cudaEventRecord(start
C/C++中計算函式執行時間的兩種方法
在寫程式碼中,有時候我們需要評估某段程式碼或者函式的執行時間;方法就是在該段程式碼或者函式前面,記錄一個時間T1,在程式碼段或函式後面記錄時間T2,那其執行時間就是T2-T1,下面看看具體
【C++】C++中幾種測試程式執行時間的方法
關於C++中計算時間的一些總結 一、使用GetTickCount()函式 GetTickCount()是一個函式,可以把它理解為打點計時器。GetTickCount()是通過計算從函式開始執行計時
利用IAR Timeline工具測試delay函式執行時間
"要把大象放冰箱,總共分幾步",呵呵,寫到本篇部落格的時候突然想起小品宋丹丹說的那句經典臺詞了(俺們東北人兒對本山大叔的作品真是滾瓜爛熟了,搞的舍友還時不時跟我學上一學),哈哈,所以就索性給題目也加上了“幾步”的說法,把複雜的事情簡單化,也起到吸引人眼球的作用(當然本篇也是有實料的,進
Python使用裝飾器和執行緒限制函式執行時間的方法
前言: (不想看廢話的可以直接copy尾部的程式碼) 在八月上旬的時候,曾經寫過一個多執行緒爬蟲。程式在執行時經常莫名的卡死。這令我很是費解,後來才發現,是在請求對方資源時,伺服器長時間未返回完資料。導致IO阻塞。 其實不只是爬蟲,很多時候一個函式很可能因為某種不可預知的事情,而有時很可能會卡
Java 多執行緒同步的五種方法 [轉]
程式碼很簡單,我就不解釋了,看看執行結果怎樣呢?截取了其中的一部分,是不是很亂,有寫看不懂。 餘額不足 賬戶餘額:0 餘額不足 賬戶餘額:100 1441790503354存進:100 賬戶餘額:100 1441790504354存進:100 賬戶餘額:100 144179050
iOS 給測試人員測試手機APP的四種方法:真機執行(略),打ipa包,(testFlighe)郵件,蒲公英(一)打ipa包
APP上線前測試,無外乎 一:用資料線真機除錯(以前需要下載真機除錯證書) 二:打.ipa包給測試人員(上限100人) 2.1 打包APP的.ipa 包給測試人員之前,如果沒有新增裝置的UDID號, 先進入蘋果開發者中心(添加了直接跳到2.6) 2.2點
delphi 只允許執行一個例項的三種方法轉
讓程式只執行一個例項 Windows 下一個典型的特徵就是多工,我們可以同時開啟多個視窗進行操作,也可以同時執行程式的多個例項,比如可以開啟許多個資源管理器進行檔案的移動複製操作。但有時出於某種考慮(比如安全性),我們要做出一些限制,讓程式只能夠執行一個例項。在Delp
Python筆記——幾種Python執行時間的計算方法
首先說一下我遇到的坑,生產上遇到的問題,我排程Python指令碼執行並監控這個程序,python指令碼執行時間遠遠大於python指令碼中自己統計的程式執行時間。 監控python指令碼執行的時間是36個小時,而python指令碼中統計自己執行的時間是4個小時左右。 問題暴漏
linux下robotframework執行測試用例的幾種方法
1、執行指定的測試用例檔案(Test Suite) [[email protected] cases]# pybot purge.txt 2、執行整個porject目錄下的所有測試用例 [[email protected] cases]
Android延時執行呼叫的幾種方法(轉)
From: http://blog.sina.com.cn/s/blog_46726d2401015t8q.html 一、開啟新執行緒 new Thread(newRunnable() { publicvoidrun() { Thread.sle
幾種Python執行時間的計算方法
首先說一下我遇到的坑,生產上遇到的問題,我排程Python指令碼執行並監控這個程序,python指令碼執行時間遠遠大於python指令碼中自己統計的程式執行時間。 監控python指令碼執行的時間是36個小時,而python指令碼中統計自己執行的時間是4個小時
讓線程按順序執行8種方法
new 超過 需求 功能 並發 通過 流量 true throw 實現我們下面需要完成這樣一個應用場景: 1.早上;2.測試人員、產品經理、開發人員陸續的來公司上班;3.產品經理規劃新需求;4.開發人員開發新需求功能;5.測試人員測試新功能。 規劃需求,開發需求新功能,測試
Linux 技巧:讓進程在後臺可靠執行的幾種方法
stl 選項 con 中斷 program ng- dem 不同 正在 我們常常會碰到這種問題。用 telnet/ssh 登錄了遠程的 Linux server,執行了一些耗時較長的任務, 結果卻因為網絡的不穩定導致任務中途失敗。怎樣讓命令提交後不受本地關閉終端
CSS清除浮動大全共8種方法
clear flow 推薦 hidden 適合 line bili display zoom 1,父級div定義 height 復制代碼 代碼如下: <style type="text/css"> .div1{background:#000080;bord
ios 將一個函數在主線程執行的4種方法
don gcd lec sel eth ted 線程隊列 nsthread gpo GCD方法,通過向主線程隊列發送一個block塊,使block裏的方法可以在主線程中執行。 dispatch_async(dispatch_get_main_queue(), ^{ /