函數(shù):
創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比東烏珠穆沁網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式東烏珠穆沁網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋東烏珠穆沁地區(qū)。費用合理售后完善,十載實體公司更值得信賴。
voiddelay(uinti)
{
while(i)i--;
}
這樣的延遲設(shè)計很不好,因為受影響的因素太多。
首先就是機器的CPU頻率,快的CPU執(zhí)行i--這句的機器時間短,慢的機器就很慢。
其次是當前機器的負荷情況,負荷較重時,系統(tǒng)給當前進程分配的CPU時間少,執(zhí)行這些語句的機會就少,延遲就增加了。
影響因素還有很多在此不再列舉。
做延遲程序主要有以下幾種方法:
1.定時器法
用CWnd::SetTimer()函數(shù)設(shè)置定時器,當定時時間到時發(fā)送WM_TIMER消息觸發(fā)CWnd::OnTimer()函數(shù),重載它把自己的代碼放進去。
SetTimer()參數(shù)為毫秒,此方法定時不高,受系統(tǒng)負荷影響。
2.休眠法
調(diào)用系統(tǒng)API函數(shù)Sleep(2000);參數(shù)單位是毫秒,2000代表2秒。
此方法主要收到當前系統(tǒng)負荷的影響,定時不太準確
3.時刻比較法
定義兩個CTime變量,一個用于記錄起始時刻,另一個放在循環(huán)體中不斷刷新當前時刻,并減去起始時刻,自己計算是否到時間了。
此方法因CTime變量只能獲取秒級的時刻,且收到系統(tǒng)負荷影響,精度也較低。
4.CPU滴答查詢法
利用兩個API函數(shù)QueryPerformanceFrequency()和QueryPerformanceCounter()分別獲取CPU的頻率和CPU滴答數(shù),依時刻比較法自己計算時刻差值。
因為CPU滴答數(shù)是等于CPU的機器周期的,所以是Windows系統(tǒng)里最最精確的計時方法了?,F(xiàn)在的CPU主頻都是GHz級的,因此理論上計時精度可以到納秒。
只要系統(tǒng)負荷不太重,此法可用于極其精確的延時程序。
因為Windows并不是實時操作系統(tǒng),因此對于太過精確的計時,還是無能為力的。
1、sleep()函數(shù):秒級休眠函數(shù)
#include unistd.h
unsigned int sleep(unsigned int unSeconds);
參數(shù)unSeconds表示需要休眠的秒數(shù);
2、usleep()函數(shù):微秒級休眠函數(shù);
#include unistd.h
int usleep(useconds_t lMicroSeconds);
參數(shù)lMicroSeconds表示要休眠的微秒數(shù);
#ifndef _SUSECONDS_T
#define _SUSECONDS_T
typedef long suseconds_t; /* signed # of microseconds */
#endif /* _SUSECONDS_T */
類型useconds_t定義在頭文件/usr/include/sys/types.h中;
3、nanosleep()函數(shù):納秒級休眠函數(shù);
#include time.h
int nanosleep(const struct timespec* rqtp, struct timespec* rmtp);
4、其它休眠函數(shù):
select()、pselect()、poll();等;
select()函數(shù)也可以精確到微秒,pselect()函數(shù)也可以精確到納秒。
clock()是C/C++中的計時函數(shù),而與其相關(guān)的數(shù)據(jù)類型是clock_t。
它的具體功能是返回處理器調(diào)用某個進程或函數(shù)所花費的時間。函數(shù)返回從“開啟這個程序進程”到“程序中調(diào)用clock()函數(shù)”時之間的CPU時鐘計時單元(clock tick)數(shù),其中clock_t是用來保存時間的數(shù)據(jù)類型。
在time.h文件中,我們可以找到對它的定義:
#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif
clock_t其實就是long,即長整形。該函數(shù)返回值是硬件滴答數(shù),要換算成秒或者毫秒,需要除以CLK_TCK或者 CLK_TCK CLOCKS_PER_SEC。比如,在VC++6.0下,這兩個量的值都是1000,這表示硬件滴答1000下是1秒,因此要計算一個進程的時間,用clock()除以1000即可。
clock的返回值一直是0的原因:
1、編譯器優(yōu)化,for循環(huán)實際根本沒執(zhí)行,直接跳過去了,所以時間為0。
2、clock計算的是程序占用cpu的時間,如果你的程序執(zhí)行的動作很少,那么clock算出的時間也很少。
3、建議使用time gettimeofday函數(shù)來計時。
擴展資料:
C語言中clock()函數(shù)的程序例1:(TC下運行通過)
#include?stdio.h
#include?time.h
int?main(void)
{
clock_t?start,?end;
start?=?clock();
delay(2000);
end?=?clock();
printf("The?time?was:?%f\n",?(double)(end?-?start)?/?CLK_TCK);
return?0;
}
說明:CLK_TCK?定義在TC中的time.h中:#define?CLK_TCK18.2。
在VC6.0中也有關(guān)于CLK_TCK的宏定義,不過其值不再是18.2,而是1000。
實際上在VC6.0中CLK_TCK已完全等同CLOCKS_PER_SEC。
參考資料來源:百度百科-clock()
循環(huán)j*8505次.
假設(shè)j開始等于100,
while外循環(huán)則循環(huán)100次,
每次執(zhí)行一次內(nèi)循環(huán),
內(nèi)循環(huán)每次執(zhí)行8505次.
總共100*8505次.
你這個硬件處理器的頻率可能運算8505次計算為1秒(或毫秒/微秒/納秒),
然后delay函數(shù)實現(xiàn)循環(huán)n秒(或毫秒/微秒/納秒).
應(yīng)該不是秒,
1秒才運算8000多次的話那.....
C語言獲取當前系統(tǒng)時間的幾種方式
C語言獲取系統(tǒng)時間的幾種方式
C語言中如何獲取時間?精度如何?
1 使用time_t time( time_t * timer ) 精確到秒
2 使用clock_t clock() 得到的是CPU時間精確到1/CLOCKS_PER_SEC秒
3 計算時間差使用double difftime( time_t timer1, time_t timer0 )
4 使用DWORD GetTickCount() 精確到毫秒
5 如果使用MFC的CTime類,可以用CTime::GetCurrentTime() 精確到秒
6 要獲取高精度時間,可以使用
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)
獲取系統(tǒng)的計數(shù)器的頻率
BOOL QueryPerformanceCounter(LARGE_INTEGER
*lpPerformanceCount)
獲取計數(shù)器的值
然后用兩次計數(shù)器的差除以Frequency就得到時間。
7 Multimedia Timer Functions
The following functions are used with multimedia timers.
timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime
哥們 實現(xiàn)不了的 受機器體系結(jié)構(gòu)和處理器限制 時間相關(guān)的都是用匯編做的 這樣才能精確計算時間
網(wǎng)頁標題:c語言納秒價格函數(shù),c語言獲取納秒時間戳
轉(zhuǎn)載注明:http://m.rwnh.cn/article34/phjdpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站收錄、企業(yè)建站、網(wǎng)站設(shè)計、域名注冊、網(wǎng)站維護
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)