• <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>
            posts - 297,  comments - 15,  trackbacks - 0
            介紹
                   我們?cè)诤饬恳粋€(gè)函數(shù)運(yùn)行時(shí)間,或者判斷一個(gè)算法的時(shí)間效率,或者在程序中我們需要一個(gè)定時(shí)器,定時(shí)執(zhí)行一個(gè)特定的操作,比如在多媒體中,比如在游戲中等,都會(huì)用到時(shí)間函數(shù)。還比如我們通過記錄函數(shù)或者算法開始和截至的時(shí)間,然后利用兩者之差得出函數(shù)或者算法的運(yùn)行時(shí)間。編譯器和操作系統(tǒng)為我們提供了很多時(shí)間函數(shù),這些時(shí)間函數(shù)的精度也是各不相同的,所以,如果我們想得到準(zhǔn)確的結(jié)果,必須使用合適的時(shí)間函數(shù)。現(xiàn)在我就介紹windows下的幾種常用時(shí)間函數(shù)。
            1Sleep函數(shù)
            使用:sleep(1000),在Windows和Linux下1000代表的含義并不相同,Windows下的表示1000毫秒,也就是1秒鐘;Linux下表示1000秒,Linux下使用毫秒級(jí)別的函數(shù)可以使用usleep。
            原理:sleep函數(shù)是使調(diào)用sleep函數(shù)的線程休眠,線程主動(dòng)放棄時(shí)間片。當(dāng)經(jīng)過指定的時(shí)間間隔后,再啟動(dòng)線程,繼續(xù)執(zhí)行代碼。Sleep函數(shù)并不能起到定時(shí)的作用,主要作用是延時(shí)。在一些多線程中可能會(huì)看到sleep(0);其主要目的是讓出時(shí)間片。
            精度:sleep函數(shù)的精度非常低,當(dāng)系統(tǒng)越忙它精度也就越低,有時(shí)候我們休眠1秒,可能3秒后才能繼續(xù)執(zhí)行。它的精度取決于線程自身優(yōu)先級(jí)、其他線程的優(yōu)先級(jí),以及線程的數(shù)量等因素。
            2MFC下的timer事件
                   使用:1.調(diào)用函數(shù)SetTimer()設(shè)置定時(shí)間隔,如SetTimer(0,100,NULL)即為設(shè)置100毫秒的時(shí)間間隔;2.在應(yīng)用程序中增加定時(shí)響應(yīng)函數(shù)OnTimer(),并在該函數(shù)中添加響應(yīng)的處理語句,用來完成時(shí)間到時(shí)的操作。
                原理:sleep函數(shù)一樣。不同的是timer是一個(gè)定時(shí)器,可以指定回調(diào)函數(shù),默認(rèn)為OnTimer()函數(shù)。
                精度:timer事件的精度范圍在毫米級(jí)別,系統(tǒng)越忙其精度也就越差。
            3C語言下的Time
                   使用:time_t t;time(&t);Time函數(shù)是獲取當(dāng)前時(shí)間。
                原理:time函數(shù)主要用于獲取當(dāng)前時(shí)間,比如我們做一個(gè)電子時(shí)鐘程序,就可以使用此函數(shù),獲取系統(tǒng)當(dāng)前的時(shí)間。
                精度:秒級(jí)別
            4COM對(duì)象中的COleDateTimeCOleDateTimeSpan
                使用:COleDateTime start_time = COleDateTime::GetCurrentTime();
            COleDateTimeSpan end_time = COleDateTime::GetCurrentTime()-start_time;
            While(end_time.GetTotalSeconds() < 2)
            {
            // 處理延時(shí)或定時(shí)期間能處理其他的消息
            DoSomething()
            end_time = COleDateTime::GetCurrentTime-start_time;
            }
            原理:以上代表延時(shí)2秒,而這兩秒內(nèi)我們可以循環(huán)調(diào)用DoSomething(),從而實(shí)現(xiàn)在延時(shí)的時(shí)候我們也能夠處理其他的函數(shù),或者消息。COleDateTime,COleDateTimeSpanMFCCTimeCTimeSpanCOM中的應(yīng)用,所以,上面的方法對(duì)于CTimeCTimeSpa同樣有效。
                   精度:秒級(jí)別
            5C語言下的時(shí)鐘周期clock()
                   使用:   clock_t start = clock();
                          Sleep(100);
                          clock_t end = clock();
                      double d = (double)(start - end) / CLOCKS_PER_SEC;
                   原理:clock()是獲取計(jì)算機(jī)啟動(dòng)后的時(shí)間間隔。
            精度:ms級(jí)別,對(duì)于短時(shí)間內(nèi)的定時(shí)或者延時(shí)可以達(dá)到ms級(jí)別,對(duì)于時(shí)間比較長(zhǎng)的定時(shí)或者延遲精度還是不夠。在windows下CLOCKS_PER_SEC為1000。
            6Windows下的GetTickCount()
            使用: DWORD start = GetTickCount();
                    Sleep(100);
                    DWORD end = GetTickCount();
            原理:GetTickCount()是獲取系統(tǒng)啟動(dòng)后的時(shí)間間隔。通過進(jìn)入函數(shù)開始定時(shí),到退出函數(shù)結(jié)束定時(shí),從而可以判斷出函數(shù)的執(zhí)行時(shí)間,這種時(shí)間也并非是函數(shù)或者算法的真實(shí)執(zhí)行時(shí)間,因?yàn)樵诤瘮?shù)和算法線程不可能一直占用CPU,對(duì)于所有判斷執(zhí)行時(shí)間的函數(shù)都是一樣,不過基本上已經(jīng)很準(zhǔn)確,可以通過查詢進(jìn)行定時(shí)。GetTickCount()Clock()函數(shù)是向主板BIOSreal time clock時(shí)間,會(huì)有中斷產(chǎn)生,以及延遲問題。
            精度:WindowsNT 3.5以及以后版本精度是10ms,它的時(shí)間精度比clock函數(shù)的要高,GetTickCount()常用于多媒體中。
            7WindowstimeGetTime
            使用:需要包含Mmsystem.hWindows.h,加入靜態(tài)庫(kù)Winmm.lib.
            timeBeginPeriod(1);
            DWORD start = timeGetTime();
                          Sleep(100);
                      DWORD end = timeGetTime();

            timeEndPeriod(1);
            原理:timeGetTime也時(shí)常用于多媒體定時(shí)器中,可以通過查詢進(jìn)行定時(shí)。通過查詢進(jìn)行定時(shí),本身也會(huì)影響定時(shí)器的定時(shí)精度。
            精度:毫秒,與GetTickCount()相當(dāng)。但是和GetTickCount相比,timeGetTime可以通過timeBeginPeriod,timeEndPeriod設(shè)置定時(shí)器的最小解析精度, timeBeginPeriod,timeEndPeriod必須成對(duì)出現(xiàn)。
            8windows下的timeSetEvent
            使用:還記的VC下的Timer嗎?Timer是一個(gè)定時(shí)器,而以上我們提到幾種時(shí)間函數(shù)或者類型,實(shí)現(xiàn)定時(shí)功能只能通過輪訓(xùn)來實(shí)現(xiàn),也就是必須另外創(chuàng)建一個(gè)線程單獨(dú)處理,這樣會(huì)影響定時(shí)精度,好在windows提供了內(nèi)置的定時(shí)器timeSetEvent,函數(shù)原型為
            MMRESULT timeSetEvent( UINT uDelay, //以毫秒指定事件的周期
            UINT uResolution, //以毫秒指定延時(shí)的精度,數(shù)值越小定時(shí)器事件分辨率越高。缺省值為1ms
            LPTIMECALLBACK lpTimeProc, //指向一個(gè)回調(diào)函數(shù)
            WORD dwUser, //存放用戶提供的回調(diào)數(shù)據(jù)
            UINT fuEvent )// 標(biāo)志參數(shù),TIME_ONESHOT:執(zhí)行一次;TIME_PERIODIC:周期性執(zhí)行
                   具體應(yīng)用時(shí),可以通過調(diào)用timeSetEvent()函數(shù),將需要周期性執(zhí)行的任務(wù)定義在 lpFunction回調(diào)函數(shù)中(如:定時(shí)采樣、控制等),從而完成所需處理的事件。需要注意的是:任務(wù)處理的時(shí)間不能大于周期間隔時(shí)間。另外,在定時(shí)器使用完畢后,應(yīng)及時(shí)調(diào)用timeKillEvent()將之釋放。
            原理:可以理解為代回調(diào)函數(shù)的timeGetTime
            精度:毫秒,timeSetEvent可以通過timeBeginPeriod,timeEndPeriod設(shè)置定時(shí)器的最小解析精度, timeBeginPeriod,timeEndPeriod必須成對(duì)出現(xiàn)。
            9:高精度時(shí)控函數(shù)QueryPerformanceFrequencyQueryPerformanceCounter
            使用:LARGE_INTEGER m_nFreq;
                      LARGE_INTEGER m_nBeginTime;
                      LARGE_INTEGER nEndTime;
                      QueryPerformanceFrequency(&m_nFreq); //
            獲取時(shí)鐘周期
                      QueryPerformanceCounter(&m_nBeginTime); // 獲取時(shí)鐘計(jì)數(shù)
                      Sleep(100);
                      QueryPerformanceCounter(&nEndTime);
                 cout << (nEndTime.QuadPart-m_nBeginTime.QuadPart)*1000/m_nFreq.QuadPart << endl;
            原理:CPU上也有一個(gè)計(jì)數(shù)器,以機(jī)器的clock為單位,可以通過rdtsc讀取,而不用中斷,因此其精度與系統(tǒng)時(shí)間相當(dāng)。
            精度:計(jì)算機(jī)獲取硬件支持,精度比較高,可以通過它判斷其他時(shí)間函數(shù)的精度范圍。
            10小結(jié):以上提到常用的9種時(shí)間函數(shù),由于他們的用處不同,所以他們的精度也不盡相同,所以如果簡(jiǎn)單的延時(shí)可以用sleep函數(shù),稍微準(zhǔn)確的延時(shí)可以使用clock函數(shù),GetTickCount函數(shù),更高級(jí)的實(shí)用 timeGetTime函數(shù);簡(jiǎn)單的定時(shí)事件可以用Timer,準(zhǔn)確地可以用timeSetEvent;或取一般系統(tǒng)時(shí)間可以通time,或者 CTime,或者COleDateTime,獲取準(zhǔn)確的時(shí)間可以用clock,或者GetTickCount函數(shù),或者timeGetTime函數(shù),而獲取準(zhǔn)確地系統(tǒng)時(shí)間要使用硬件支持的QueryPerformanceFrequency函數(shù),QueryPerformanceCounter函數(shù)。
            posted on 2009-02-06 23:32 chatler 閱讀(428) 評(píng)論(0)  編輯 收藏 引用 所屬分類: windows
            <2009年2月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            1234567

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(guān),覺得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            国产精品久久国产精品99盘| 国产成人无码久久久精品一| 久久久久国产成人精品亚洲午夜| 青青青青久久精品国产h久久精品五福影院1421| 精品国产婷婷久久久| 18禁黄久久久AAA片| 99精品久久精品| 性做久久久久久久久| 久久久久亚洲精品天堂| 久久精品国产亚洲7777| 久久午夜伦鲁片免费无码| 欧美国产成人久久精品| 久久国产精品99久久久久久老狼| 亚洲国产高清精品线久久| 久久青青草原精品影院| 国产色综合久久无码有码| 久久国产精品二国产精品| 精品久久久无码人妻中文字幕豆芽| 性欧美大战久久久久久久 | 国产精品成人久久久| 91久久九九无码成人网站| 久久99国产综合精品| 久久精品国产日本波多野结衣| 精品久久久久久国产三级| 亚洲va久久久噜噜噜久久狠狠| 久久久免费观成人影院| 成人a毛片久久免费播放| 996久久国产精品线观看| 久久国产精品99国产精| 午夜天堂精品久久久久| 久久久久国产精品嫩草影院| 日韩久久无码免费毛片软件| 国产精品九九久久免费视频 | 久久精品国产亚洲av高清漫画| 亚洲а∨天堂久久精品| 热RE99久久精品国产66热| 久久久亚洲精品蜜桃臀| 性做久久久久久久久| 一级a性色生活片久久无 | 伊人久久大香线蕉亚洲五月天| 综合久久久久久中文字幕亚洲国产国产综合一区首 |