Windows 各種計時函數總結

來源:互聯網
上載者:User
 本文對Windows平台下常用的計時函數進行總結,包括精度為秒、毫秒、微秒三種精度的5種方法。分為在標準C/C++下的二種time()及clock(),標準C/C++所以使用的time()及clock()不僅可以用在Windows系統,也可以用於Linux系統。在Windows系統下三種,使用Windows提供的API介面timeGetTime()、GetTickCount()及QueryPerformanceCounter()來完成。文章最後給出了5種計時方法範例程式碼。

 

標準C/C++的二個計時函數time()及clock()

 

time_t time(time_t *timer);

返回以格林尼治時間(GMT)為標準,從1970年1月1日00:00:00到現在的此時此刻所經過的秒數。

time_t實際是個long長整型typedef long time_t;

標頭檔:#include <time.h>

 

clock_t clock(void);

返回進程啟動到調用函數時所經過的CPU時鐘計時單元(clock tick)數,在MSDN中稱之為掛鐘時間(wal-clock),以毫秒為單位。

clock_t實際是個long長整型typedef long clock_t;

標頭檔:#include <time.h>

 

 

Windows系統API函數

timeGetTime()、GetTickCount()及QueryPerformanceCounter()

 

DWORD timeGetTime(VOID);

返回系統時間,以毫秒為單位。系統時間是從系統啟動到調用函數時所經過的毫秒數。注意,這個值是32位的,會在0到2^32之間迴圈,約49.71天。

標頭檔:#include <Mmsystem.h>            

引用庫:#pragma comment(lib, "Winmm.lib")  

 

DWORD WINAPI GetTickCount(void);

這個函數和timeGetTime()一樣也是返回系統時間,以毫秒為單位。

標頭檔:直接使用#include <windows.h>就可以了。

 

高精度計時,以微秒為單位(1毫秒=1000微秒)。

先看二個函數的定義

BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);

得到高精度計時器的值(如果存在這樣的計時器)。

BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

返回硬體支援的高精度計數器的頻率(次每秒),返回0表示失敗。

再看看LARGE_INTEGER

它其實是一個聯合體,可以得到__int64 QuadPart;也可以分別得到低32位DWORD LowPart和高32位的值LONG HighPart。

在使用時,先使用QueryPerformanceFrequency()得到計數器的頻率,再計算二次調用QueryPerformanceCounter()所得的計時器值之差,用差去除以頻率就得到精確的計時了。

標頭檔:直接使用#include <windows.h>就可以了。

 

 

下面給出範例程式碼,可以在你電腦上測試下。

//Windows系統下time(),clock(),timeGetTime(),GetTickCount(),QueryPerformanceCounter()來計時 by MoreWindows#include <stdio.h>#include <windows.h>#include <time.h> //time_t time()  clock_t clock()#include <Mmsystem.h>             //timeGetTime()#pragma comment(lib, "Winmm.lib")   //timeGetTime()int main(){//用time()來計時  秒time_t timeBegin, timeEnd;timeBegin = time(NULL);Sleep(1000);timeEnd = time(NULL);printf("%d\n", timeEnd - timeBegin);//用clock()來計時  毫秒clock_t  clockBegin, clockEnd;clockBegin = clock();Sleep(800);clockEnd = clock();printf("%d\n", clockEnd - clockBegin);//用timeGetTime()來計時  毫秒DWORD  dwBegin, dwEnd;dwBegin = timeGetTime();Sleep(800);dwEnd = timeGetTime();printf("%d\n", dwEnd - dwBegin);//用GetTickCount()來計時  毫秒DWORD  dwGTCBegin, dwGTCEnd;dwGTCBegin = GetTickCount();Sleep(800);dwGTCEnd = GetTickCount();printf("%d\n", dwGTCEnd - dwGTCBegin);//用QueryPerformanceCounter()來計時  微秒LARGE_INTEGER  large_interger;double dff;__int64  c1, c2;QueryPerformanceFrequency(&large_interger);dff = large_interger.QuadPart;QueryPerformanceCounter(&large_interger);c1 = large_interger.QuadPart;Sleep(800);QueryPerformanceCounter(&large_interger);c2 = large_interger.QuadPart;printf("本機高精度計時器頻率%lf\n", dff);printf("第一次計時器值%I64d 第二次計時器值%I64d 計時器差%I64d\n", c1, c2, c2 - c1);printf("計時%lf毫秒\n", (c2 - c1) * 1000 / dff);printf("By MoreWindows\n");return 0;}

下面是本人電腦上的測試結果:

 

 

 

轉載請標明出處,原文地址:http://blog.csdn.net/morewindows/article/details/6854764

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.