• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            colorful

            zc qq:1337220912

             

            精確獲取時間(QueryPerformanceCounter)

            LARGE_INTEGER tima,timb;
            QueryPerformanceCounter(&tima);

            在 Windows Server 2003 和 WindowsXP 中使用 QueryPerformanceCounter 函數的程序可能執(zhí)行不當

            QueryPerformanceCounter 來精確計算執(zhí)行時間
            QueryPerformanceCounter 來精確計算執(zhí)行時間
            // 這個程式展示了如何使用QueryPerformanceCounter 來精確計算執(zhí)行時間
            //代碼


             

            1. LARGE_INTEGER m_liPerfFreq={0};
            2.  //獲取每秒多少CPU Performance Tick
            3.  QueryPerformanceFrequency(&m_liPerfFreq); 

            4.  LARGE_INTEGER m_liPerfStart={0};
            5.  QueryPerformanceCounter(&m_liPerfStart);

            6.  for(int i=0; i< 100; i++)
            7.   cout << i << endl;

            8.  LARGE_INTEGER liPerfNow={0};
            9.  // 計算CPU運行到現在的時間
            10.  QueryPerformanceCounter(&liPerfNow);

            11.  int time=( ((liPerfNow.QuadPart - m_liPerfStart.QuadPart) * 1000)/m_liPerfFreq.QuadPart);

            12.  char buffer[100];
            13.  sprintf(buffer,"執(zhí)行時間 %d millisecond ",time);

            14.  cout<<buffer<<endl;


            QueryPerformanceCounter()這個函數返回高精確度性能計數器的值,它可以以微妙為單位計時.但是 QueryPerformanceCounter()確切的精確計時的最小單位是與系統(tǒng)有關的,所以,必須要查詢系統(tǒng)以得到 QueryPerformanceCounter()返回的嘀噠聲的頻率.
            QueryPerformanceFrequency()提供了這個頻率值,返回每秒嘀噠聲的個數.
            計算確切的時間是從第一次調用QueryPerformanceCounter()開始的
            假設得到的LARGE_INTEGER為nStartCounter,過一段時間后再次調用該函數結束的,
            設得到nStopCounter.
            兩者之差除以QueryPerformanceFrequency()的頻率就是開始到結束之間的秒數.由于計時函數本身要耗費很少的時間,要減去一個很少的時間開銷.但一般都把這個開銷忽略.公式如下:   
                                     nStopCounter-nStartCounter
            ElapsedTime=------------------------------------ - overhead
            frequency

            double time=(nStopCounter.QuadPart-nStartCounter.QuadPart)/frequency.QuadPart

             

             

            這兩個函數是VC提供的僅供Windows 95及其后續(xù)版本使用的精確時間函數,并要求計算機從硬件上支持精確定時器。
            QueryPerformanceFrequency()函數和QueryPerformanceCounter()函數的原型如下:

                   BOOL  QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);        BOOL  QueryPerformanceCounter(LARGE_INTEGER *lpCount);

              數據類型ARGE_INTEGER既可以是一個8字節(jié)長的整型數,也可以是兩個4字節(jié)長的整型數的聯合結構, 其具體用法根據編譯器是否支持64位而定。該類型的定義如下:

                   typedef union _LARGE_INTEGER        {            struct            {               DWORD LowPart ;// 4字節(jié)整型數               LONG  HighPart;// 4字節(jié)整型數            };            LONGLONG QuadPart ;// 8字節(jié)整型數                     }LARGE_INTEGER ;

              在進行定時之前,先調用QueryPerformanceFrequency()函數獲得機器內部定時器的時鐘頻率, 然后在需要嚴格定時的事件發(fā)生之前和發(fā)生之后分別調用QueryPerformanceCounter()函數,利用兩次獲得的計數之差及時鐘頻率,計算出事件經 歷的精確時間。下列代碼實現1ms的精確定時:

             
            1.        LARGE_INTEGER litmp; 
            2.        LONGLONG QPart1,QPart2;
            3.        double dfMinus, dfFreq, dfTim; 
            4.        QueryPerformanceFrequency(&litmp);
            5.        dfFreq = (double)litmp.QuadPart;// 獲得計數器的時鐘頻率
            6.        QueryPerformanceCounter(&litmp);
            7.        QPart1 = litmp.QuadPart;// 獲得初始值
            8.        do
            9.        {
            10.           QueryPerformanceCounter(&litmp);
            11.           QPart2 = litmp.QuadPart;//獲得中止值
            12.           dfMinus = (double)(QPart2-QPart1);
            13.           dfTim = dfMinus / dfFreq;// 獲得對應的時間值,單位為秒
            14.        }while(dfTim<0.001);

              其定時誤差不超過1微秒,精度與CPU等機器配置有關。 下面的程序用來測試函數Sleep(100)的精確持續(xù)時間:

             
            1.        LARGE_INTEGER litmp; 
            2.        LONGLONG QPart1,QPart2;
            3.        double dfMinus, dfFreq, dfTim; 
            4.        QueryPerformanceFrequency(&litmp);
            5.        dfFreq = (double)litmp.QuadPart;// 獲得計數器的時鐘頻率
            6.        QueryPerformanceCounter(&litmp);
            7.        QPart1 = litmp.QuadPart;// 獲得初始值
            8.        Sleep(100);
            9.        QueryPerformanceCounter(&litmp);
            10.        QPart2 = litmp.QuadPart;//獲得中止值
            11.        dfMinus = (double)(QPart2-QPart1);
            12.        dfTim = dfMinus / dfFreq;// 獲得對應的時間值,單位為秒    

              由于Sleep()函數自身的誤差,上述程序每次執(zhí)行的結果都會有微小誤差。下列代碼實現1微秒的精確定時:

             
            1.        LARGE_INTEGER litmp; 
            2.        LONGLONG QPart1,QPart2;
            3.        double dfMinus, dfFreq, dfTim; 
            4.        QueryPerformanceFrequency(&litmp);
            5.        dfFreq = (double)litmp.QuadPart;// 獲得計數器的時鐘頻率
            6.        QueryPerformanceCounter(&litmp);
            7.        QPart1 = litmp.QuadPart;// 獲得初始值
            8.        do
            9.        {
            10.           QueryPerformanceCounter(&litmp);
            11.           QPart2 = litmp.QuadPart;//獲得中止值
            12.           dfMinus = (double)(QPart2-QPart1);
            13.           dfTim = dfMinus / dfFreq;// 獲得對應的時間值,單位為秒
            14.        }while(dfTim<0.000001);

            其定時誤差一般不超過0.5微秒,精度與CPU等機器配置有關。(

            posted on 2012-07-27 19:00 多彩人生 閱讀(521) 評論(0)  編輯 收藏 引用

            導航

            統(tǒng)計

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲精品无码久久久久AV麻豆| 久久久久久国产精品免费无码 | 国产偷久久久精品专区| 九九精品久久久久久噜噜| 久久久久久国产精品美女| 国产午夜精品久久久久免费视| 欧美亚洲另类久久综合| 色婷婷综合久久久久中文字幕| 亚洲精品乱码久久久久久久久久久久| 日韩乱码人妻无码中文字幕久久| .精品久久久麻豆国产精品| 久久久久久A亚洲欧洲AV冫| 久久亚洲欧美国产精品| 久久se精品一区二区影院| 亚洲欧美成人综合久久久| 国产精品亚洲美女久久久| 亚洲午夜久久久久久久久久| 国产高潮国产高潮久久久91 | 久久婷婷综合中文字幕| 欧美粉嫩小泬久久久久久久 | 欧美精品丝袜久久久中文字幕| 亚洲AV无一区二区三区久久| 久久精品国产亚洲Aⅴ香蕉| 久久99精品久久久久久久不卡| 久久综合伊人77777麻豆| 久久AAAA片一区二区| 久久精品免费一区二区三区| 午夜人妻久久久久久久久| 亚洲国产精品无码久久久久久曰 | 亚洲欧美日韩精品久久亚洲区| 国内精品人妻无码久久久影院 | 亚洲国产成人久久一区久久| 国产精品国色综合久久| 综合久久国产九一剧情麻豆| 青青草原综合久久大伊人导航| 久久精品国产免费| 99久久精品费精品国产| 久久亚洲国产精品一区二区| 青青国产成人久久91网| 老司机国内精品久久久久| 亚洲国产精品婷婷久久|