• <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 - 71,  comments - 41,  trackbacks - 0

            System Clock級高精度計時器,支持Window/Linux平臺。輸入?yún)?shù)CPU主頻,該值可從注冊表(Windows)或/proc/cpuinfo(Linux)中獲得。
            大道至簡——精度高,抖動大

            // ?*****************************************************************************
            // ??IA32Timer???version:??1.0????date:?04/26/2006
            // ??----------------------------------------------------------------------------
            // ??This?class?is?a?wrapper?of?IA32?RDTSC?
            // ??(ReaD?Time?Stamp?Counter)?instruction.
            // ??It?will?help?you?get?the?interval?time?with
            // ??different?level.
            // ??----------------------------------------------------------------------------
            // ??Copyright?(C)?2006?-?Charles?Zu
            // ?*****************************************************************************
            // ?????Note:?All?the?classes?the?author?designed?are?leading?with?"Z"
            // ??which?is?contradistinguished?form?the?leading?with?"C"?of?MFC
            // ?*****************************************************************************

            class ?ZIA32Timer
            {
            public :
            ????ZIA32Timer(
            double ?ghz)
            ????:m_startcycle(
            0 ),?m_ghz(ghz)
            ????
            {
            #ifndef?_WIN32
            ????????m_high?
            = ? 0 ;
            ????????m_low?
            = ? 0 ;
            #endif
            ????}


            ????
            void ?Start()
            ????
            {
            #ifdef?_WIN32
            ????????m_startcycle?
            = ?RTSC();
            #else
            ????????RTSC();
            ????????m_startcycle?
            = ?(unsigned? long ? long )?m_high? * ?( 1 ? << ? 30 )? * ? 4 ? + ?m_low;
            #endif
            ????}


            #ifdef?_WIN32
            ????unsigned?__int64?Stop(
            int ?unit);
            #else
            ????unsigned?
            long ? long ?Stop( int ?unit);
            #endif

            ????
            static ? enum ?Unit {CYCLE,?NS,?US,?MS,?S} s_unit;

            private :
            #ifdef?_WIN32
            ????unsigned?__int64??m_startcycle;
            #else
            ????unsigned?
            long ? long ?m_startcycle;
            ????unsigned?
            int ?m_high;
            ????unsigned?
            int ?m_low;
            #endif

            #ifdef?_WIN32
            ????unsigned?__int64?RTSC();
            #else
            ???
            void ?RTSC();
            #endif

            double ?m_ghz;

            }
            ;

            #ifdef?_WIN32
            ????inline?unsigned?__int64?ZIA32Timer::RTSC()
            ????
            {
            ????????_asm????_emit?
            0x0F
            ????????_asm????_emit?
            0x31
            ????}

            #else
            ????inline?
            void ?ZIA32Timer::RTSC()
            ????
            {
            ????????asm(
            " rdtsc;?movl?%%edx,%0;?movl?%%eax,%1 " ??? // ?Read?cycle?counter
            ????????????:? " =r " ?(m_high),? " =r " ?(m_low)????????????????????????????????????
            ????????????:?
            /* ?No?input? */ ?????????????????????????????
            ????????????:?
            " %edx " ,? " %eax " );
            ????}

            #endif

            #ifdef?_WIN32
            ????inline?unsigned?__int64?ZIA32Timer::Stop(
            int ?unit)
            ????
            {
            ????????
            switch (unit)
            ????????
            {
            ????????
            case ?CYCLE:
            ????????????
            return ?(unsigned?__int64)(RTSC()? - ?m_startcycle);
            ????????
            break ;

            ????????
            case ?NS:
            ????????????
            return ?(unsigned?__int64)((RTSC()? - ?m_startcycle)? / ?m_ghz);
            ????????
            break ;

            ????????
            case ?US:
            ????????????
            return ?(unsigned?__int64)((RTSC()? - ?m_startcycle)? / ?m_ghz? / ? 1000 );
            ????????
            break ;

            ????????
            case ?MS:
            ????????????
            return ?(unsigned?__int64)((RTSC()? - ?m_startcycle)? / ?m_ghz? / ? 1000000 );
            ????????
            break ;

            ????????
            case ?S:
            ????????????
            return ?(unsigned?__int64)((RTSC()? - ?m_startcycle)? / ?m_ghz? / ? 1000000000 );
            ????????
            break ;

            ????????
            default :
            ????????????
            break ;
            ????????}

            ????????
            return ? 0 ;
            ????}

            #else
            ????inline?unsigned?
            long ? long ?ZIA32Timer::Stop( int ?unit)
            ????
            {
            ????????unsigned?
            long ? long ?stoppiont;
            ????????RTSC();
            ????????stoppiont?
            = ?(((unsigned? long ? long )m_high)? << ? 32 )? + ?m_low;
            ????????
            ????????
            switch (unit)
            ????????
            {
            ????????
            case ?CYCLE:
            ????????????
            return ?(unsigned? long ? long )(stoppiont? - ?m_startcycle);
            ????????????
            break ;

            ????????
            case ?NS:
            ????????????
            return ?(unsigned? long ? long )((stoppiont? - ?m_startcycle)? / ?m_ghz);
            ????????????
            break ;

            ????????
            case ?US:
            ????????????
            return ?(unsigned? long ? long )((stoppiont? - ?m_startcycle)? / ?m_ghz? / ? 1000 );
            ????????????
            break ;

            ????????
            case ?MS:
            ????????????
            return ?(unsigned? long ? long )((stoppiont? - ?m_startcycle)? / ?m_ghz? / ? 1000000 );
            ????????????
            break ;

            ????????
            case ?S:
            ????????????
            return ?(unsigned? long ? long )((stoppiont? - ?m_startcycle)? / ?m_ghz? / ? 1000000000 );
            ????????????
            break ;

            ????????
            default :
            ????????????
            break ;
            ????????}

            ????????
            return ? 0 ;
            ????}

            #endif

            下邊給個測試程序,由于我的CPU主頻為3GHZ,所以寫了hard code
            #include?<stdio.h>
            #ifdef?_WIN32
            #include?
            <windows.h>
            #else
            #include?
            <unistd.h>
            #endif

            #include?
            "IA32Timer.h"

            void?MySleep()
            {
            #ifdef?_WIN32
            //?????Sleep(1);
            ?????Sleep(10);
            //?????Sleep(100);
            //?????Sleep(1000);
            #else
            ????usleep(
            100?*?1000);
            #endif
            }


            int?main(int?argc,?char**?argv)
            {
            ????ZIA32Timer?ztimer(
            3);?//the?arg?is?the?GHZ?of?your?CPU

            #ifdef?_WIN32
            unsigned?__int64?interval;
            #else
            unsigned?
            long?long?interval;
            #endif

            ????ztimer.Start();
            ????MySleep();
            ????interval?
            =?ztimer.Stop(ZIA32Timer::CYCLE);
            ????fprintf(stdout,?
            "interval?=?%u?(cycle)\n",?interval);

            ????ztimer.Start();
            ????MySleep();
            ????interval?
            =?ztimer.Stop(ZIA32Timer::NS);
            ????fprintf(stdout,?
            "interval?=?%u?(ns)\n",?interval);

            ????ztimer.Start();
            ????MySleep();
            ????interval?
            =?ztimer.Stop(ZIA32Timer::US);
            ????fprintf(stdout,?
            "interval?=?%u?(us)\n",?interval);

            ????ztimer.Start();
            ????MySleep();
            ????interval?
            =?ztimer.Stop(ZIA32Timer::MS);
            ????fprintf(stdout,?
            "interval?=?%u?(ms)\n",?interval);

            ????ztimer.Start();
            ????MySleep();
            ????interval?
            =?ztimer.Stop(ZIA32Timer::S);
            ????fprintf(stdout,?
            "interval?=?%u?(s)\n",?interval);

            ????
            return?0;
            }

            參考了高人的匯編實現(xiàn),自己整理,貼出來,希望對你有啟示
            posted on 2006-11-28 14:49 Charles 閱讀(1744) 評論(4)  編輯 收藏 引用 所屬分類: Helper Utility

            FeedBack:
            # re: IA32/Windows&Linux高精度計時器
            2006-11-28 18:55 | erran
            看的不是很明白, 不過
            win32下有精確計時的API:
            QueryPerformanceFrequency
            QueryPerformanceCounter
            也是Cpu級的, 用起來很方便.
            linux應(yīng)該也有這樣的系統(tǒng)API..
              回復(fù)  更多評論
              
            # re: IA32/Windows&Linux高精度計時器
            2006-11-28 19:48 | Charles
            IA32's RDTSC(ReaD Time Stamp Counter) instruction returns the number of clock cycles passed since the booting of the CPU in 64-bit unsigned integer, through the EDX and EAX 32-bit general register pair. So it is more precision than any other method:)  回復(fù)  更多評論
              
            # re: IA32/Windows&Linux高精度計時器
            2007-12-17 19:15 | input
            如果是雙核cpu會對測試結(jié)果產(chǎn)生什么影響?  回復(fù)  更多評論
              
            # re: IA32/Windows&Linux高精度計時器
            2008-01-08 11:52 | 小林子
            在采用訊馳技術(shù)的筆記本芯片上,使用 RTDSC 指令不可信,因為CPU 是變頻的  回復(fù)  更多評論
              

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


            <2006年12月>
            262728293012
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            決定開始寫工作日記,記錄一下自己的軌跡...

            常用鏈接

            留言簿(4)

            隨筆分類(70)

            隨筆檔案(71)

            charles推薦訪問

            搜索

            •  

            積分與排名

            • 積分 - 50435
            • 排名 - 449

            最新評論

            閱讀排行榜

            評論排行榜

            久久香蕉一级毛片| 国产一区二区精品久久| 国产69精品久久久久9999| 亚洲女久久久噜噜噜熟女| 久久久久亚洲AV成人网| 66精品综合久久久久久久| 久久ZYZ资源站无码中文动漫| 久久久久se色偷偷亚洲精品av| 久久久高清免费视频| 久久无码AV一区二区三区| 狠狠色丁香婷婷久久综合| 性做久久久久久久久久久| 色综合久久天天综线观看| 久久伊人五月天论坛| 久久久久亚洲av成人无码电影| 久久国产三级无码一区二区| 久久婷婷五月综合97色直播| 亚洲精品无码久久久久AV麻豆| 热久久最新网站获取| 亚洲综合日韩久久成人AV| 狠狠色婷婷久久一区二区三区| 国产欧美久久一区二区| 国内精品免费久久影院| 区久久AAA片69亚洲| 日韩乱码人妻无码中文字幕久久| 91精品国产综合久久精品| 国产成人精品久久亚洲高清不卡 | 久久露脸国产精品| 久久精品亚洲日本波多野结衣 | 精品国产一区二区三区久久久狼| 99国产精品久久| 国内精品伊人久久久久妇| 久久66热人妻偷产精品9| 国产精品综合久久第一页| 99久久做夜夜爱天天做精品| 77777亚洲午夜久久多喷| 久久综合一区二区无码| 久久亚洲私人国产精品vA| 成人国内精品久久久久一区| 久久亚洲精品国产精品| 99久久夜色精品国产网站|