• <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

             

            精確獲取時(shí)間(QueryPerformanceCounter)

            LARGE_INTEGER tima,timb;
            QueryPerformanceCounter(&tima);

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

            QueryPerformanceCounter 來(lái)精確計(jì)算執(zhí)行時(shí)間
            QueryPerformanceCounter 來(lái)精確計(jì)算執(zhí)行時(shí)間
            // 這個(gè)程式展示了如何使用QueryPerformanceCounter 來(lái)精確計(jì)算執(zhí)行時(shí)間
            //代碼


             

            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.  // 計(jì)算CPU運(yùn)行到現(xiàn)在的時(shí)間
            10.  QueryPerformanceCounter(&liPerfNow);

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

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

            14.  cout<<buffer<<endl;


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

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

             

             

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

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

              數(shù)據(jù)類(lèi)型ARGE_INTEGER既可以是一個(gè)8字節(jié)長(zhǎng)的整型數(shù),也可以是兩個(gè)4字節(jié)長(zhǎng)的整型數(shù)的聯(lián)合結(jié)構(gòu), 其具體用法根據(jù)編譯器是否支持64位而定。該類(lèi)型的定義如下:

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

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

             
            1.        LARGE_INTEGER litmp; 
            2.        LONGLONG QPart1,QPart2;
            3.        double dfMinus, dfFreq, dfTim; 
            4.        QueryPerformanceFrequency(&litmp);
            5.        dfFreq = (double)litmp.QuadPart;// 獲得計(jì)數(shù)器的時(shí)鐘頻率
            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;// 獲得對(duì)應(yīng)的時(shí)間值,單位為秒
            14.        }while(dfTim<0.001);

              其定時(shí)誤差不超過(guò)1微秒,精度與CPU等機(jī)器配置有關(guān)。 下面的程序用來(lái)測(cè)試函數(shù)Sleep(100)的精確持續(xù)時(shí)間:

             
            1.        LARGE_INTEGER litmp; 
            2.        LONGLONG QPart1,QPart2;
            3.        double dfMinus, dfFreq, dfTim; 
            4.        QueryPerformanceFrequency(&litmp);
            5.        dfFreq = (double)litmp.QuadPart;// 獲得計(jì)數(shù)器的時(shí)鐘頻率
            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;// 獲得對(duì)應(yīng)的時(shí)間值,單位為秒    

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

             
            1.        LARGE_INTEGER litmp; 
            2.        LONGLONG QPart1,QPart2;
            3.        double dfMinus, dfFreq, dfTim; 
            4.        QueryPerformanceFrequency(&litmp);
            5.        dfFreq = (double)litmp.QuadPart;// 獲得計(jì)數(shù)器的時(shí)鐘頻率
            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;// 獲得對(duì)應(yīng)的時(shí)間值,單位為秒
            14.        }while(dfTim<0.000001);

            其定時(shí)誤差一般不超過(guò)0.5微秒,精度與CPU等機(jī)器配置有關(guān)。(

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


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(3)

            隨筆分類(lèi)

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            亚洲人成无码www久久久| 尹人香蕉久久99天天拍| 色综合久久久久网| 久久久久成人精品无码 | 日韩美女18网站久久精品| 久久中文字幕无码专区| 日韩人妻无码精品久久免费一| 国产V综合V亚洲欧美久久| 久久久久久国产精品免费免费| 久久婷婷色综合一区二区| 青青草国产精品久久| 欧美日韩精品久久久久| 99久久99久久精品国产片| 亚洲欧美一区二区三区久久| 久久青草国产手机看片福利盒子| 久久这里的只有是精品23| 久久免费美女视频| 久久久久亚洲AV无码麻豆| 欧美激情精品久久久久久| www.久久精品| 久久久久人妻精品一区二区三区| 久久精品国产亚洲精品| 久久99精品国产99久久6男男| 久久精品国产2020| 亚洲国产成人久久精品99 | 久久婷婷国产综合精品| 亚洲午夜无码AV毛片久久| 99久久婷婷国产综合精品草原| 99精品国产在热久久无毒不卡| 久久综合九色综合网站| 亚洲国产成人久久精品99| 精品免费久久久久国产一区| 久久精品国产只有精品2020| 久久精品国产亚洲AV高清热| 久久精品人妻中文系列| 一本色道久久88综合日韩精品 | 久久午夜免费视频| 一本色道久久综合狠狠躁| 日韩人妻无码一区二区三区久久99| 久久免费国产精品| 香蕉99久久国产综合精品宅男自 |