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

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲国产一成人久久精品| 久久人人爽爽爽人久久久| 午夜精品久久久久久中宇| 精品久久人人爽天天玩人人妻 | 久久这里只有精品视频99| 潮喷大喷水系列无码久久精品| 2020久久精品亚洲热综合一本| 久久亚洲高清综合| 久久久久女教师免费一区| 9191精品国产免费久久| 四虎国产永久免费久久| 日韩精品久久久久久| 久久99精品国产99久久| 久久精品国产福利国产秒| 九九久久精品国产| 日本久久中文字幕| 亚洲AV无码一区东京热久久| 久久天堂AV综合合色蜜桃网| 久久99国产精品尤物| 99久久精品国产毛片| 久久综合视频网站| 久久影院综合精品| 久久精品一区二区| 亚洲国产精品成人AV无码久久综合影院| 欧美激情精品久久久久久| 中文字幕人妻色偷偷久久| 久久亚洲国产欧洲精品一| 久久婷婷五月综合成人D啪| 久久久久久国产a免费观看黄色大片 | 一本久道久久综合狠狠爱| 久久人人爽人人爽人人片av高请| 国产精品久久永久免费| 亚洲国产一成久久精品国产成人综合| 中文字幕无码久久久| 久久这里只有精品首页| 国产精品中文久久久久久久 | 精品午夜久久福利大片| 7777精品伊人久久久大香线蕉 | 久久精品国产99国产精品| 亚洲中文久久精品无码| 久久九九免费高清视频 |