一種可用來測試算法效率的足夠精確的計時方法【轉】

在實驗中經常要測試算法的效率,這時就必要要用到精確的計時方法,常用的方法如clock()等根本不起作用,因爲這些算法執行的時間實在太小了,一般都是毫秒級,甚至更低,前幾天在網上轉悠,終於找到了一種方法,如下,從MSDN Online看到的:

#include <windows.h>

   LARGE_INTEGER start, end;
   LARGE_INTEGER freq;

   SetThreadAffinityMask(GetCurrentThread(), 1);
   QueryPerformanceFrequency(&freq);
   QueryPerformanceCounter(&start);
  

   // do something

   QueryPerformanceCounter(&end);

   cout << (end.QuadPart - start.QuadPart)/(double)freq.QuadPart << " seconds" << endl;


上述代碼使用了一些在 kernel32.dll(它是 Microsoft Windows 的一部分)中實現的計時函數。這些函數以及它們使用的數據類型在 windows.h 中定義。簡單的說,在windows中有一個非常精細的時鐘,QueryPerformanceCounter可以得到當前時鐘運行的滴答數,而 QueryPerformanceFrequency 可以得到一個時鐘的頻率。這個例子中用start和end分別保存了起始時和結束時的時鐘滴答數,然後除以時鐘頻率,即得到起始時間與結束時間的差值,結果是以秒爲單位的運行時間。SetThreadAffinityMask用來設置當前線程的優先級,設爲高優先級可以減少干擾。這裏的LARGE_INTEGER等都是在windows.h中定義,只需聲明這一個頭文件即可。

我自己測試過,確實很精確,不過開始幾次運行還是不很穩定,多運行幾次後就可以穩定下來。

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/xiphiping/archive/2005/04/09/341265.aspx

發佈了14 篇原創文章 · 獲贊 8 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章