vc 程式效率測試 與 如何擷取系統精確時間

來源:互聯網
上載者:User

                GetTickCount返回(retrieve)從作業系統啟動到現在所經過(elapsed)的毫秒數,它的傳回值是DWORD。


如: DWORD time;

       time = GetTickCount();

但是

GetTickcount函數:它返回從作業系統啟動到當前所經過的毫秒數,常常用來判斷某個方法執行的時間,其函數原型是DWORD GetTickCount(void),傳回值以32位的雙字類型DWORD儲存,因此可以儲存的最大值是2^32 ms約為49.71天,因此若系統已耗用時間超過49.71天時,這個數就會歸0,MSDN中也明確的提到了:"Retrieves the number of milliseconds that have elapsed since the system was started, up to 49.7 days."。因此,如果是編寫伺服器端程式,此處一定要萬分注意,避免引起意外的狀況。特別注意:這個函數並非即時發送,而是由系統每18ms發送一次,因此其最小精度為18ms。當需要有小於18ms的精度計算時,應使用StopWatch方法進行。也就是說使用這個函數,精度不高。為了擷取精確的時間,從而獲得精確的效率測量可以使用QueryPerformanceCounter(&ticks)函數樣本程式可以這樣用:
   ////////////variables definition//////////// DWORD time1,time2,time3;//計算時間用  LARGE_INTEGER  frequency;//高效能計數器的頻率 LARGE_INTEGER start,end; start.QuadPart=0; end.QuadPart=0; frequency.QuadPart=0; long ticks=0; QueryPerformanceFrequency(&frequency);
///////////////////processing ///////////#ifdef DEBUGTIME time1 = GetTickCount(); QueryPerformanceCounter(&start);    #endif
#ifdef DEBUGTIME time2 = GetTickCount(); QueryPerformanceCounter(&end);     ticks = (long)(end.QuadPart-start.QuadPart); double millsecond=(double)ticks*1000.0/(double)frequency.QuadPart; printf("noninterpolating wasted time is %ld  number %ld  ticks %lf\n",time2-time1,arrayindex,millsecond);#endif

這是一位名叫softman11,csdn論壇裡這位作者提供的c++ 類實現

#pragma once#include<Windows.h> ///本類採用高解析度高效能計數器實現///在我的Intel T7500機器上,解析度大約是279毫微秒class StopWatch{public:    StopWatch(void);    ~StopWatch(void);private:    LARGE_INTEGER beginticks;    LARGE_INTEGER endticks ;    LARGE_INTEGER  frequency;//高效能計數器的頻率:每秒357,9545個tick  我的INTEL T7500public:    void Start();    void Stop();    double  GetCostMillisecond();    unsigned long long  GetFrequency();}; #include "StdAfx.h"#include "StopWatch.h"#include <Windows.h>#include<iostream>using namespace std; StopWatch::StopWatch(void){    beginticks.QuadPart=0;    endticks.QuadPart=0;    frequency.QuadPart=0;    QueryPerformanceFrequency(&frequency);}  StopWatch::~StopWatch(void){} void StopWatch::Start(){    //beginticks=GetTickCount();    QueryPerformanceCounter(&beginticks);     }void StopWatch::Stop(){    QueryPerformanceCounter(&endticks);     }double  StopWatch::GetCostMillisecond(){    unsigned long long cost=(unsigned long long)(endticks.QuadPart-beginticks.QuadPart);    double millsecond=(double)cost*1000.0/(double)frequency.QuadPart;        return millsecond;}unsigned long long StopWatch::GetFrequency(){    return (unsigned long long)frequency.QuadPart;}

  • 上一篇:C語言 記憶體管理詳解
  • 下一篇:typedef的四個用途和兩個陷阱
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.