青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

醬壇子

專注C++技術(shù) 在這里寫(xiě)下自己的學(xué)習(xí)心得 感悟 和大家討論 共同進(jìn)步(歡迎批評(píng)!!!)

  C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
  66 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks

公告

王一偉 湖南商學(xué)院畢業(yè) 電子信息工程專業(yè)

常用鏈接

留言簿(19)

我參與的團(tuán)隊(duì)

搜索

  •  

積分與排名

  • 積分 - 389904
  • 排名 - 64

最新隨筆

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

呵呵 隨手記一下,大家不要罵我

#include? <mmsystem.h>

#pragma comment(lib,"winmm.lib")

timegettime的標(biāo)稱是毫秒級(jí)別
但是實(shí)際上只能精確到50毫秒

使用CPU時(shí)間戳進(jìn)行高精度計(jì)時(shí)

2003-3-27 13:14:11?? GAMERES?? zhangyan_qd?? 閱讀次數(shù):?6609
  對(duì)關(guān)注性能的程序開(kāi)發(fā)人員而言,一個(gè)好的計(jì)時(shí)部件既是益友,也是良師。計(jì)時(shí)器既可以作為程序組件幫助程序員精確的控制程序進(jìn)程,又是一件有力的調(diào)試武器,在有經(jīng)驗(yàn)的程序員手里可以盡快的確定程序的性能瓶頸,或者對(duì)不同的算法作出有說(shuō)服力的性能比較。

  在Windows平臺(tái)下,常用的計(jì)時(shí)器有兩種,一種是timeGetTime多媒體計(jì)時(shí)器,它可以提供毫秒級(jí)的計(jì)時(shí)。但這個(gè)精度對(duì)很多應(yīng)用場(chǎng)合而言還是太粗糙了。另一種是QueryPerformanceCount計(jì)數(shù)器,隨系統(tǒng)的不同可以提供微秒級(jí)的計(jì)數(shù)。對(duì)于實(shí)時(shí)圖形處理、多媒體數(shù)據(jù)流處理、或者實(shí)時(shí)系統(tǒng)構(gòu)造的程序員,善用QueryPerformanceCount/QueryPerformanceFrequency是一項(xiàng)基本功。

  本文要介紹的,是另一種直接利用Pentium?CPU內(nèi)部時(shí)間戳進(jìn)行計(jì)時(shí)的高精度計(jì)時(shí)手段。以下討論主要得益于《Windows圖形編程》一書(shū),第15頁(yè)-17頁(yè),有興趣的讀者可以直接參考該書(shū)。關(guān)于RDTSC指令的詳細(xì)討論,可以參考Intel產(chǎn)品手冊(cè)。本文僅僅作拋磚之用。
  在Intel?Pentium以上級(jí)別的CPU中,有一個(gè)稱為“時(shí)間戳(Time?Stamp)”的部件,它以64位無(wú)符號(hào)整型數(shù)的格式,記錄了自CPU上電以來(lái)所經(jīng)過(guò)的時(shí)鐘周期數(shù)。由于目前的CPU主頻都非常高,因此這個(gè)部件可以達(dá)到納秒級(jí)的計(jì)時(shí)精度。這個(gè)精確性是上述兩種方法所無(wú)法比擬的。

  在Pentium以上的CPU中,提供了一條機(jī)器指令RDTSC(Read?Time?Stamp?Counter)來(lái)讀取這個(gè)時(shí)間戳的數(shù)字,并將其保存在EDX:EAX寄存器對(duì)中。由于EDX:EAX寄存器對(duì)恰好是Win32平臺(tái)下C++語(yǔ)言保存函數(shù)返回值的寄存器,所以我們可以把這條指令看成是一個(gè)普通的函數(shù)調(diào)用。像這樣:

inline?unsigned?__int64?GetCycleCount()
{
?__asm?RDTSC
}

但是不行,因?yàn)镽DTSC不被C++的內(nèi)嵌匯編器直接支持,所以我們要用_emit偽指令直接嵌入該指令的機(jī)器碼形式0X0F、0X31,如下:

inline?unsigned?__int64?GetCycleCount()
{
?__asm?_emit?0x0F
?__asm?_emit?0x31
}

以后在需要計(jì)數(shù)器的場(chǎng)合,可以像使用普通的Win32?API一樣,調(diào)用兩次GetCycleCount函數(shù),比較兩個(gè)返回值的差,像這樣:

unsigned?long?t;
t?=?(unsigned?long)GetCycleCount();
//Do?Something?time-intensive?...
t?-=?(unsigned?long)GetCycleCount();

  《Windows圖形編程》第15頁(yè)編寫(xiě)了一個(gè)類,把這個(gè)計(jì)數(shù)器封裝起來(lái)。有興趣的讀者可以去參考那個(gè)類的代碼。作者為了更精確的定時(shí),做了一點(diǎn)小小的改進(jìn),把執(zhí)行RDTSC指令的時(shí)間,通過(guò)連續(xù)兩次調(diào)用GetCycleCount函數(shù)計(jì)算出來(lái)并保存了起來(lái),以后每次計(jì)時(shí)結(jié)束后,都從實(shí)際得到的計(jì)數(shù)中減掉這一小段時(shí)間,以得到更準(zhǔn)確的計(jì)時(shí)數(shù)字。但我個(gè)人覺(jué)得這一點(diǎn)點(diǎn)改進(jìn)意義不大。在我的機(jī)器上實(shí)測(cè),這條指令大概花掉了幾十到100多個(gè)周期,在Celeron?800MHz的機(jī)器上,這不過(guò)是十分之一微秒的時(shí)間。對(duì)大多數(shù)應(yīng)用來(lái)說(shuō),這點(diǎn)時(shí)間完全可以忽略不計(jì);而對(duì)那些確實(shí)要精確到納秒數(shù)量級(jí)的應(yīng)用來(lái)說(shuō),這個(gè)補(bǔ)償也過(guò)于粗糙了。

這個(gè)方法的優(yōu)點(diǎn)是:

1.高精度。可以直接達(dá)到納秒級(jí)的計(jì)時(shí)精度(在1GHz的CPU上每個(gè)時(shí)鐘周期就是一納秒),這是其他計(jì)時(shí)方法所難以企及的。

2.成本低。timeGetTime?函數(shù)需要鏈接多媒體庫(kù)winmm.lib,QueryPerformance*?函數(shù)根據(jù)MSDN的說(shuō)明,需要硬件的支持(雖然我還沒(méi)有見(jiàn)過(guò)不支持的機(jī)器)和KERNEL庫(kù)的支持,所以二者都只能在Windows平臺(tái)下使用(關(guān)于DOS平臺(tái)下的高精度計(jì)時(shí)問(wèn)題,可以參考《圖形程序開(kāi)發(fā)人員指南》,里面有關(guān)于控制定時(shí)器8253的詳細(xì)說(shuō)明)。但RDTSC指令是一條CPU指令,凡是i386平臺(tái)下Pentium以上的機(jī)器均支持,甚至沒(méi)有平臺(tái)的限制(我相信i386版本UNIX和Linux下這個(gè)方法同樣適用,但沒(méi)有條件試驗(yàn)),而且函數(shù)調(diào)用的開(kāi)銷是最小的。

3.具有和CPU主頻直接對(duì)應(yīng)的速率關(guān)系。一個(gè)計(jì)數(shù)相當(dāng)于1/(CPU主頻Hz數(shù))秒,這樣只要知道了CPU的主頻,可以直接計(jì)算出時(shí)間。這和QueryPerformanceCount不同,后者需要通過(guò)QueryPerformanceFrequency獲取當(dāng)前計(jì)數(shù)器每秒的計(jì)數(shù)次數(shù)才能換算成時(shí)間。

這個(gè)方法的缺點(diǎn)是:

1.現(xiàn)有的C/C++編譯器多數(shù)不直接支持使用RDTSC指令,需要用直接嵌入機(jī)器碼的方式編程,比較麻煩。

2.數(shù)據(jù)抖動(dòng)比較厲害。其實(shí)對(duì)任何計(jì)量手段而言,精度和穩(wěn)定性永遠(yuǎn)是一對(duì)矛盾。如果用低精度的timeGetTime來(lái)計(jì)時(shí),基本上每次計(jì)時(shí)的結(jié)果都是相同的;而RDTSC指令每次結(jié)果都不一樣,經(jīng)常有幾百甚至上千的差距。這是這種方法高精度本身固有的矛盾。

關(guān)于這個(gè)方法計(jì)時(shí)的最大長(zhǎng)度,我們可以簡(jiǎn)單的用下列公式計(jì)算:

自CPU上電以來(lái)的秒數(shù)?=?RDTSC讀出的周期數(shù)?/?CPU主頻速率(Hz)

64位無(wú)符號(hào)整數(shù)所能表達(dá)的最大數(shù)字是1.8×10^19,在我的Celeron?800上可以計(jì)時(shí)大約700年(書(shū)中說(shuō)可以在200MHz的Pentium上計(jì)時(shí)117年,這個(gè)數(shù)字不知道是怎么得出來(lái)的,與我的計(jì)算有出入)。無(wú)論如何,我們大可不必關(guān)心溢出的問(wèn)題。

下面是幾個(gè)小例子,簡(jiǎn)要比較了三種計(jì)時(shí)方法的用法與精度

//Timer1.cpp?使用了RDTSC指令的Timer類//KTimer類的定義可以參見(jiàn)《Windows圖形編程》P15
//編譯行:CL?Timer1.cpp?/link?USER32.lib
#include?<stdio.h>
#include?"KTimer.h"
main()
{
?unsigned?t;
?KTimer?timer;
?timer.Start();
?Sleep(1000);
?t?=?timer.Stop();
?printf("Lasting?Time:?%d\n",t);
}

//Timer2.cpp?使用了timeGetTime函數(shù)
//需包含<mmsys.h>,但由于Windows頭文件錯(cuò)綜復(fù)雜的關(guān)系
//簡(jiǎn)單包含<windows.h>比較偷懶:)
//編譯行:CL?timer2.cpp?/link?winmm.lib?
#include?<windows.h>
#include?<stdio.h>

main()
{
?DWORD?t1,?t2;
?t1?=?timeGetTime();
?Sleep(1000);
?t2?=?timeGetTime();
?printf("Begin?Time:?%u\n",?t1);
?printf("End?Time:?%u\n",?t2);
?printf("Lasting?Time:?%u\n",(t2-t1));
}

//Timer3.cpp?使用了QueryPerformanceCounter函數(shù)
//編譯行:CL?timer3.cpp?/link?KERNEl32.lib
#include?<windows.h>
#include?<stdio.h>

main()
{
?LARGE_INTEGER?t1,?t2,?tc;
?QueryPerformanceFrequency(&tc);
?printf("Frequency:?%u\n",?tc.QuadPart);
?QueryPerformanceCounter(&t1);
?Sleep(1000);
?QueryPerformanceCounter(&t2);
?printf("Begin?Time:?%u\n",?t1.QuadPart);
?printf("End?Time:?%u\n",?t2.QuadPart);
?printf("Lasting?Time:?%u\n",(?t2.QuadPart-?t1.QuadPart));
}

////////////////////////////////////////////////
//以上三個(gè)示例程序都是測(cè)試1秒鐘休眠所耗費(fèi)的時(shí)間
file://測(cè)/試環(huán)境:Celeron?800MHz?/?256M?SDRAM??
//??????????Windows?2000?Professional?SP2
//??????????Microsoft?Visual?C++?6.0?SP5
////////////////////////////////////////////////

以下是Timer1的運(yùn)行結(jié)果,使用的是高精度的RDTSC指令
Lasting?Time:?804586872

以下是Timer2的運(yùn)行結(jié)果,使用的是最粗糙的timeGetTime?API
Begin?Time:?20254254
End?Time:?20255255
Lasting?Time:?1001

以下是Timer3的運(yùn)行結(jié)果,使用的是QueryPerformanceCount?API
Frequency:?3579545
Begin?Time:?3804729124
End?Time:?3808298836
Lasting?Time:?3569712

參考資料:
[YUAN?2002]Feng?Yuan?著,英宇工作室?譯,Windows圖形編程,機(jī)械工業(yè)出版社,2002.4.,P15-17
posted on 2006-12-14 10:59 @王一偉 閱讀(24774) 評(píng)論(2)  編輯 收藏 引用

Feedback

# re: timegettime與高精度計(jì)時(shí) 2006-12-23 12:26 pengkuny
發(fā)到首頁(yè)去吧  回復(fù)  更多評(píng)論
  

# re: timegettime與高精度計(jì)時(shí) 2008-07-21 11:08 王一偉
此種CPU時(shí)間戳計(jì)時(shí)方式 現(xiàn)在已經(jīng)徹底不用鳥(niǎo)。。。。


雙核 + 變頻技術(shù)直接讓拋棄了這個(gè)技術(shù)

現(xiàn)在一般取自于主板或者內(nèi)存  回復(fù)  更多評(píng)論
  


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


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美韩日一区| 性视频1819p久久| 欧美韩日亚洲| 夜夜嗨av一区二区三区四区| 亚洲视频专区在线| 国产日韩精品视频一区| 久久久久国产一区二区三区| 蜜臀91精品一区二区三区| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美了一区在线观看| 日韩一级网站| 久久久久一本一区二区青青蜜月| 亚洲第一主播视频| 欧美日韩系列| 欧美一区二区三区婷婷月色| 欧美高清hd18日本| 亚洲私人影院在线观看| 国产综合久久| 欧美日韩a区| 久久av最新网址| 欧美激情二区三区| 性欧美办公室18xxxxhd| 在线日韩av| 国产精品捆绑调教| 老色鬼精品视频在线观看播放| 99一区二区| 另类人畜视频在线| 亚洲一区国产精品| 在线免费观看一区二区三区| 欧美日韩久久不卡| 久久精品夜色噜噜亚洲aⅴ| 亚洲国产日韩一区| 久久激情视频免费观看| 亚洲另类春色国产| 狠狠色丁香婷婷综合久久片| 欧美日韩亚洲高清一区二区| 久久国产66| 亚洲一级片在线观看| 欧美高清自拍一区| 欧美在线观看视频| 亚洲视频高清| 亚洲国产日本| 国模私拍一区二区三区| 国产精品扒开腿做爽爽爽软件| 久久视频免费观看| 久久爱www久久做| 亚洲午夜高清视频| 亚洲精品午夜| 亚洲高清视频一区二区| 久久综合色88| 久久9热精品视频| 亚洲男人av电影| 99www免费人成精品| 亚洲高清自拍| 黄色亚洲在线| 国产一区二区日韩| 国产精品亚洲综合久久| 欧美性大战久久久久久久蜜臀| 欧美成人一区二区| 欧美成人激情在线| 美日韩丰满少妇在线观看| 久久精品亚洲精品| 欧美在线综合视频| 午夜在线a亚洲v天堂网2018| 亚洲午夜精品一区二区| 一区二区三区精品国产| 亚洲免费久久| 一区二区三区四区五区精品视频| 亚洲精品美女在线| 亚洲美女视频| 日韩午夜电影av| 99re6这里只有精品| 日韩午夜av在线| 一区二区三区欧美成人| 一区二区三区.www| 亚洲一区二区三区四区五区午夜| 一区二区三区日韩欧美| 亚洲视频欧美视频| 午夜精品成人在线视频| 欧美一区二区三区在线视频 | 亚洲综合日韩中文字幕v在线| 99视频超级精品| 99re66热这里只有精品4| 一本色道久久综合亚洲二区三区| 99精品国产福利在线观看免费| 亚洲美女性视频| 亚洲自拍另类| 久久电影一区| 牛牛影视久久网| 欧美日韩久久不卡| 国产精品美女xx| 国产亚洲欧洲一区高清在线观看 | 欧美激情视频网站| 欧美视频一区二区三区四区| 国产精品日韩欧美大师| 激情久久久久久久久久久久久久久久| 18成人免费观看视频| 日韩午夜精品视频| 亚洲欧美999| 另类激情亚洲| 亚洲精选一区二区| 一区二区三区免费看| 欧美在线亚洲在线| 欧美精品日韩| 国产亚洲人成网站在线观看| 亚洲国产精品v| 亚洲男人的天堂在线| 久久免费午夜影院| 亚洲精品免费网站| 欧美亚洲一区| 欧美激情综合网| 国产日韩亚洲欧美| 亚洲精品资源美女情侣酒店| 西西裸体人体做爰大胆久久久| 美女精品在线观看| 夜色激情一区二区| 久久欧美肥婆一二区| 国产精品久久二区二区| 亚洲高清免费| 欧美一区二区三区播放老司机| 欧美成人性网| 亚洲综合色网站| 欧美极品影院| 一区二区三区在线观看国产| 在线亚洲自拍| 欧美黄色免费网站| 性xx色xx综合久久久xx| 欧美日韩精品综合在线| 永久久久久久| 久久精品视频播放| 一本久久综合亚洲鲁鲁| 免费在线观看日韩欧美| 国产日韩欧美综合精品| 亚洲婷婷在线| 亚洲欧洲日本mm| 久久青青草原一区二区| 国产日韩专区| 亚洲欧美综合一区| 亚洲毛片在线观看| 欧美电影资源| 亚洲高清视频在线观看| 欧美在线免费一级片| 一本色道久久综合亚洲精品婷婷| 美女91精品| 伊人久久大香线蕉av超碰演员| 欧美一区二区成人| 一区二区三区高清视频在线观看| 久久综合久久综合九色| 国内精品亚洲| 久久久一二三| 欧美影院精品一区| 国产一区高清视频| 久久久99爱| 欧美一级播放| 国产亚洲一区二区精品| 久久精品电影| 久久激情婷婷| 在线观看久久av| 欧美国产激情| 免费在线亚洲| 亚洲精品综合精品自拍| 91久久嫩草影院一区二区| 欧美国产极速在线| 99爱精品视频| 中文日韩在线| 国产精一区二区三区| 久久国产精品99久久久久久老狼 | 欧美日韩一区二区精品| 一级日韩一区在线观看| 亚洲美女福利视频网站| 欧美人与禽猛交乱配视频| 亚洲黄一区二区三区| 麻豆精品一区二区综合av | 亚洲欧美国产精品专区久久| 国产伦精品一区二区三区| 亚洲欧美99| 一区二区三区不卡视频在线观看| 欧美成人综合| 在线亚洲国产精品网站| 99re8这里有精品热视频免费 | 久久综合色88| 夜夜夜久久久| 日韩亚洲精品视频| 欧美视频一区二区| 久久成人亚洲| 久久精品二区亚洲w码| 红桃视频成人| 亚洲精品中文字幕有码专区| 欧美国产综合视频| 在线亚洲自拍| 日韩网站免费观看| 国产一区二区三区高清在线观看| 久久精品成人欧美大片古装| 久久aⅴ国产欧美74aaa| 亚洲日本中文字幕区| 亚洲美女av黄| 国产精品网站一区| 欧美国产日韩一区二区| 欧美精品二区三区四区免费看视频| 99热在线精品观看|