• <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ù)  更多評論
              
            <2006年12月>
            262728293012
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

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

            常用鏈接

            留言簿(4)

            隨筆分類(70)

            隨筆檔案(71)

            charles推薦訪問

            搜索

            •  

            積分與排名

            • 積分 - 50433
            • 排名 - 449

            最新評論

            閱讀排行榜

            評論排行榜

            久久国产高清字幕中文| 97超级碰碰碰久久久久| 一本色道久久综合亚洲精品| 午夜久久久久久禁播电影| 久久精品成人| 久久久久亚洲Av无码专| 一本久久综合亚洲鲁鲁五月天| 婷婷久久香蕉五月综合加勒比| 97精品久久天干天天天按摩| 一日本道伊人久久综合影| 久久91这里精品国产2020| 国产精品久久自在自线观看| 欧美麻豆久久久久久中文| 青草影院天堂男人久久| 久久99精品久久久久久| 国产精品中文久久久久久久| 久久久久无码中| 久久精品国产亚洲麻豆| 婷婷伊人久久大香线蕉AV| 伊人久久大香线蕉成人| 99久久婷婷国产综合精品草原| 久久香蕉国产线看观看99| 99久久夜色精品国产网站| 亚洲国产成人久久综合碰| 狠狠久久综合伊人不卡| 国产精品久久久久久福利漫画 | 久久香综合精品久久伊人| 精品久久久久久国产91| 国产精品一区二区久久不卡| 99久久成人国产精品免费| 99蜜桃臀久久久欧美精品网站 | 久久精品国产91久久麻豆自制| 97精品国产97久久久久久免费| 欧美日韩中文字幕久久久不卡| 国内精品久久久久久久久电影网| 亚洲伊人久久大香线蕉苏妲己| 成人久久综合网| 欧美精品一本久久男人的天堂| 久久精品成人免费网站| 亚洲国产成人久久综合碰碰动漫3d| 久久国产乱子精品免费女|