1. 程式人生 > >測試函式執行時間的8種方法——轉

測試函式執行時間的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(), ^{ /