演算法中的精確時間計數器的應用

2021-04-02 21:39:04 字數 1763 閱讀 8114

演算法中的精確時間計數器的應用

流浪狗 2006.3

評價乙個演算法的好壞,在執行時所消耗的時間是乙個很重要的引數,可以反應出該演算法的時間複雜度。要測試乙個程式執行時所消耗的時間,我們可以寫出很多種演算法。很多編譯器都提供了相關的時間函式庫,還有系統的api等等。但是,我們會發現這些函式在程式中根本本能得到滿意的結果。有時候設計得很好的演算法,或者很小的演算法,在執行的時候非常快,在1ms以內,這時候要測試這個演算法所消耗的時間就是一件不容易的事情。

在標頭檔案time.h中有個函式clock(),返回clock_t的型別,可以通過兩次呼叫clock函式,來確定時間間隔。api中有乙個函式叫做gettickcount的函式,可以得到當前計算機執行的時間,它返回乙個dword值。在程式短之前加入一句dword t=gettickcount();在程式段後加入t=gettickcount()-t,則t的結果就是此程式段執行的時間。但是我們會發現很多程式段的結果輸出都是0ms,所以我們需要比這個精度更高的函式。有沒有這樣的函式呢,通過查詢msdn,發現有兩個函式滿足要求,queryperformancefrequency和queryperformancecounter,它可以精確到0.5微秒,具體說明可以參見msdn。為了方便我們以後在對演算法時間的計算,我們把他封裝成乙個計時器類:

#include

#include

using namespace std;

class timetake

~timetake()

void print()

return n;

}dword mode2(dword m,dword n)

m=n%r;

if(m==0)

n=r%m;

if(n==0)

}return result;

}//求接a,b使得am+bn=d,d為最大公倍數

dword mode(dword m,dword n,int& a,int& b)

}return d;

}然後編寫主程式進行測試:

int _tmain(int argc, _tchar* argv)

tk.start();

d1=mode1(m,n);

cout<<"the mode 1's result is "

d2=mode2(m,n);

cout<<"the mode 2's result is "

d2=mode(m,n,a,b);

cout<<"the result is "<=0)

cout<<"*m+"

}輸出結果如下:

please input m and n

150456

the mode 1's result is 6

1.9469 ms elapse in the  algothim!

the mode 2's result is 6

1.23787 ms elapse in the  algothim!

the result is -3*m+1*n=6

1.18842 ms elapse in the  algothim!

press any key to continue

通過多組資料的輸入,我們可以肯定的是第二種演算法比第一種演算法用的時間少,因為第二種演算法避免了第一種演算法的重複賦值。但是第三種演算法與前兩種演算法相比,體現出時間的不確定性,有時候時間處於前兩種演算法之間,有時候又比前兩種都少。從表面上來看,第三種演算法比前兩種做的事情都要多,但是為什麼他用的時間最少呢?

計數器 通用計數器的應用價值

隨著科學技術發展,一些應用系統,如大型通訊系統,電力系統,特別是高速運動目標的跟蹤定位系統,對時間間隔的測量精度提出了越來越高的要求,同時我國對時間間隔計數器的應用掌控性,更傾向於依賴於國產裝置實現數字式頻率計的研發。雖然通用計數器測量週期誤差不可能從根本上消除,但通過對轉換誤差 量化誤差及各類誤差...

redis的計數器應用

redis的計數器應用 唯一計數是 系統中十分常見的乙個功能特性,例如 需要統計每天訪問的人數 unique visitor 也就是 uv 計數問題很常見,但解決起來可能十分複雜 一是需要計數的量可能很大,比如大型的站點每天有數百萬的人訪問,資料量相當大 二是如果通過資料庫表來存資料,比如記錄一篇文...

Java中的計數器CountDownLatch

用給定的計數 初始化 countdownlatch。由於呼叫了 countdown 方法,所以在當前計數到達零之前,await 方法會一直受阻塞。之後,會釋放所有等待的執行緒,await 的所有後續呼叫都將立即返回。這種現象只出現一次 計數無法被重置。方法 意義void await 使當前執行緒在鎖...