網(wǎng)摘和自己整理的,所以分類為翻譯,請見諒。 不過當(dāng)計算算法耗時的時候,不要忘記second,不能只要用Milliseconds來減,不然后出現(xiàn)負(fù)值,若是算法耗時太長就得用minutes啦。再不然,就hours……
//方案— 優(yōu)點(diǎn):僅使用C標(biāo)準(zhǔn)庫;缺點(diǎn):只能精確到秒級
//方案二 優(yōu)點(diǎn):能精確到毫秒級;缺點(diǎn):使用了windows API //方案五,貌似這個也是兼容C/C++的
int64_t ts = systemTime(); 打印時候使用%ld
====================================================================================================
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 QueryPerformanceFrequenc 獲取系統(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 //********************************************************************* //用標(biāo)準(zhǔn)C實現(xiàn)獲取當(dāng)前系統(tǒng)時間的函數(shù)
一.time()函數(shù)
#include "time.h" void main () { time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); printf ( "\007The current date/time is: %s", asctime (timeinfo) ); exit(0); } ================= #include -- 必須的時間函數(shù)頭文件 time_t -- 時間類型(time.h 定義是typedef long time_t; 追根溯源,time_t是long) struct tm -- 時間結(jié)構(gòu),time.h 定義如下: int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; time ( &rawtime ); -- 獲取時間,以秒計,從1970年1月一日起算,存于rawtime localtime ( &rawtime ); -- 轉(zhuǎn)為當(dāng)?shù)貢r間,tm 時間結(jié)構(gòu) asctime ()-- 轉(zhuǎn)為標(biāo)準(zhǔn)ASCII時間格式: 星期 月 日 時:分:秒 年
----------------------------------------------------------------------------- 二.clock()函數(shù),用clock()函數(shù),得到系統(tǒng)啟動以后的毫秒級時間,然后除以CLOCKS_PER_SEC,就可以換成“秒”,標(biāo)準(zhǔn)c函數(shù)。 clock_t clock ( void ); #include clock_t t = clock(); long sec = t / CLOCKS_PER_SEC; 他是記錄時鐘周期的,實現(xiàn)看來不會很精確,需要試驗驗證; --------------------------------------------------------------------------- 三.gettime(&t); 據(jù)說tc2.0的time結(jié)構(gòu)含有毫秒信息 #include #include int main(void) { struct time t; gettime(&t); printf("The current time is: -:d:d.d\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund); return 0; } time 是一個結(jié)構(gòu)體,, 其中成員函數(shù) ti_hund 是毫秒。。。
-------------------------------------------------------------------------------- 四.GetTickCount(),這個是windows里面常用來計算程序運(yùn)行時間的函數(shù); DWORD dwStart = GetTickCount(); //這里運(yùn)行你的程序代碼 DWORD dwEnd = GetTickCount(); 則(dwEnd-dwStart)就是你的程序運(yùn)行時間, 以毫秒為單位 這個函數(shù)只精確到55ms,1個tick就是55ms。 -------------------------------------------------------------------------------- 五.timeGetTime()t,imeGetTime()基本等于GetTickCount(),但是精度更高 DWORD dwStart = timeGetTime(); //這里運(yùn)行你的程序代碼 DWORD dwEnd = timeGetTime(); 則(dwEnd-dwStart)就是你的程序運(yùn)行時間, 以毫秒為單位 雖然返回的值單位應(yīng)該是ms,但傳說精度只有10ms。 ========================================= //*****************************************************************Unix ##unix時間相關(guān),也是標(biāo)準(zhǔn)庫的 //********************************************************************* 1.timegm函數(shù)只是將struct tm結(jié)構(gòu)轉(zhuǎn)成time_t結(jié)構(gòu),不使用時區(qū)信息; time_t timegm(struct tm *tm); 2.mktime使用時區(qū)信息 time_t mktime(struct tm *tm); timelocal 函數(shù)是GNU擴(kuò)展的與posix函數(shù)mktime相當(dāng) time_t timelocal (struct tm *tm); 3.gmtime函數(shù)只是將time_t結(jié)構(gòu)轉(zhuǎn)成struct tm結(jié)構(gòu),不使用時區(qū)信息; struct tm * gmtime(const time_t *clock); 4.localtime使用時區(qū)信息 struct tm * localtime(const time_t *clock); 1.time獲取時間,stime設(shè)置時間 time_t t; t = time(&t); 2.stime其參數(shù)應(yīng)該是GMT時間,根據(jù)本地時區(qū)設(shè)置為本地時間; int stime(time_t *tp) 3.UTC=true 表示采用夏時制; 4.文件的修改時間等信息全部采用GMT時間存放,不同的系統(tǒng)在得到修改時間后通過localtime轉(zhuǎn)換成本地時間; 5.設(shè)置時區(qū)推薦使用setup來設(shè)置; 6.設(shè)置時區(qū)也可以先更變/etc/sysconfig/clock中的設(shè)置再將ln -fs /usr/share/zoneinfo/xxxx/xxx /etc/localtime 才能重效 time_t只能表示68年的范圍,即mktime只能返回1970-2038這一段范圍的time_t 看看你的系統(tǒng)是否有time_t64,它能表示更大的時間范圍 //***************************************************************windows ##Window里面的一些不一樣的 //*********************************************************************
一.CTime () 類 VC編程一般使用CTime類 獲得當(dāng)前日期和時間
CTime t = GetCurrentTime(); SYSTEMTIME 結(jié)構(gòu)包含毫秒信息 typedef struct _SYSTEMTIME { WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; } SYSTEMTIME, *PSYSTEMTIME; SYSTEMTIME t1; GetSystemTime(&t1) CTime curTime(t1); WORD ms = t1.wMilliseconds; SYSTEMTIME sysTm; ::GetLocalTime(&sysTm); 在time.h中的_strtime() //只能在windows中用 char t[11]; _strtime(t); puts(t);
//***************************** 獲得當(dāng)前日期和時間 CTime tm=CTime::GetCurrentTime(); CString str=tm.Format("%Y-%m-%d"); 在VC中,我們可以借助CTime時間類,獲取系統(tǒng)當(dāng)前日期,具體使用方法如下: CTime t = CTime::GetCurrentTime(); //獲取系統(tǒng)日期,存儲在t里面 int d=t.GetDay(); //獲得當(dāng)前日期 int y=t.GetYear(); //獲取當(dāng)前年份 int m=t.GetMonth(); //獲取當(dāng)前月份 int h=t.GetHour(); //獲取當(dāng)前為幾時 int mm=t.GetMinute(); //獲取當(dāng)前分鐘 int s=t.GetSecond(); //獲取當(dāng)前秒 int w=t.GetDayOfWeek(); //獲取星期幾,注意1為星期天,7為星期六
二.CTimeSpan類 如果想計算兩段時間的差值,可以使用CTimeSpan類,具體使用方法如下: CTime t1( 1999, 3, 19, 22, 15, 0 ); CTime t = CTime::GetCurrentTime(); CTimeSpan span=t-t1; //計算當(dāng)前系統(tǒng)時間與時間t1的間隔 int iDay=span.GetDays(); //獲取這段時間間隔共有多少天 int iHour=span.GetTotalHours(); //獲取總共有多少小時 int iMin=span.GetTotalMinutes();//獲取總共有多少分鐘 int iSec=span.GetTotalSeconds();//獲取總共有多少秒
------------------------------------------------------------------------------
三._timeb()函數(shù) _timeb定義在SYS\TIMEB.H,有四個fields dstflag millitm time timezone void _ftime( struct _timeb *timeptr ); struct _timeb timebuffer; _ftime( &timebuffer ); 取當(dāng)前時間:文檔講可以到ms,有人測試,好象只能到16ms!
四.設(shè)置計時器 定義TIMER ID #define TIMERID_JISUANFANGSHI 2 在適當(dāng)?shù)牡胤皆O(shè)置時鐘,需要開始其作用的地方; SetTimer(TIMERID_JISUANFANGSHI,200,NULL); 在不需要定時器的時候的時候銷毀掉時鐘 KillTimer(TIMERID_JISUANFANGSHI); 對應(yīng)VC程序的消息映射 void CJisuan::OnTimer(UINT nIDEvent) {switch(nIDEvent)} --------------------------------------------------------------------------------------- ##如何設(shè)定當(dāng)前系統(tǒng)時間---------------------------------------windows SYSTEMTIME m_myLocalTime,*lpSystemTime; m_myLocalTime.wYear=2003; m_myLocalTime.wM; m_myLocalTime.wDay=1; m_myLocalTime.wHour=0; m_myLocalTime.wMinute=0; m_myLocalTime.wSec; m_myLocalTime.wMillisec; lpSystemTime=&m_myLocalTime; if( SetLocalTime(lpSystemTime) ) //此處換成 SetSystemTime( )也不行 MessageBox("OK !"); else MessageBox("Error !"); SYSTEMTIME m_myLocalTime,*lpSystemTime; m_myLocalTime.wYear=2003; m_myLocalTime.wM; m_myLocalTime.wDay=1; lpSystemTime=&m_myLocalTime; if( SetDate(lpSystemTime) ) //此處換成 SetSystemTime( )也不行 MessageBox("OK !"); else MessageBox("Error !");
本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/khuang2008/archive/2008/12/09/3483274.aspx
一種制作微秒級精度定時器的方法 當(dāng)使用定時器時,在很多情況下只用到毫秒級的時間間隔,所以只需用到下面的兩種常用方式就滿足要求了。一是用SetTimer函數(shù)建立一個定時器后,在程序中通過處理由定時器發(fā)送到線程消息隊列中的WM_TIMER消息,而得到定時的效果(退出程序時別忘了調(diào)用和SetTimer配對使用的KillTimer函數(shù))。二是利用GetTickCount函數(shù)可以返回自計算機(jī)啟動后的時間,通過兩次調(diào)用GetTickCount函數(shù),然后控制它們的差值來取得定時效果,此方式跟第一種方式一樣,精度也是毫秒級的。 用這兩種方式取得的定時效果雖然在許多場合已經(jīng)滿足實際的要求,但由于它們的精度只有毫秒級的,而且在要求定時時間間隔小時,實際定時誤差大。下面介紹一種能取得高精度定時的方法。
在一些計算機(jī)硬件系統(tǒng)中,包含有高精度運(yùn)行計數(shù)器(high-resolution
1、首先調(diào)用QueryPerformanceFrequenc 2、在需要定時的代碼的兩端分別調(diào)用QueryPerformanceCounter以取得高精度運(yùn)行計數(shù)器的數(shù)值n1,n2。兩次數(shù)值的差值通過f換算成時間間隔,t=(n2-n1)/f。 下面舉一個例子來演示這種方法的使用及它的精確度。
在VC
其中包含兩個靜態(tài)文本框,兩個編輯框和兩個按紐。上面和下面位置的編輯框的ID分別為IDC_E_TEST和IDC_E_ACTUAL,通過MFC
void {
//
UpdateData(TRUE);
LARGE_INTEGER
if(!QueryPerformanceFrequenc
MessageBox("Your
"Not
LARGE_INTEGER
test.QuadPart
ret
m_dwAct
UpdateData(FALSE); }
LARGE_INTEGER /////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
{
LARGE_INTEGER
QueryPerformanceCounter(
current
while(
QueryPerformanceCounter(
Elapse.QuadPart
return } 注:別忘了在頭文件中為此函數(shù)添加函數(shù)聲明。
至此,可以編譯和執(zhí)行此工程了,結(jié)果如上圖所示。在本人所用的機(jī)上(奔騰366,
上面的函數(shù)由于演示測試的需要,沒有在函數(shù)級封裝,下面給出的函數(shù)基本上可以以全局函數(shù)的形式照搬到別的程序中。
BOOL /////////////////////////////////////////////////////////////////////////////////////////////////////////////
// {
BOOL
LARGE_INTEGER
if(!QueryPerformanceFrequenc {
::MessageBox(NULL,
"Not
return }
interval.QuadPart
bNormal
current
while(
bNormal
return }
需要指出的是,由于在此函數(shù)中的代碼很多,機(jī)器在執(zhí)行這些代碼所花費(fèi)的時間也很長,所以在需要幾個微秒的延時時,會影響精度。實際上,讀者在熟悉這種方法后,只要使用QueryPerformanceFrequenc
使用CPU時間戳進(jìn)行高精度計時 對關(guān)注性能的程序開發(fā)人員而言,一個好的計時部件既是益友,也是良師。計時器既可以作為程序組件幫助程序員精確的控制程序進(jìn)程,又是一件有力的調(diào)試武器,在有經(jīng)驗的程序員手里可以盡快的確定程序的性能瓶頸,或者對不同的算法作出有說服力的性能比較。
在Windows平臺下,常用的計時器有兩種,一種是timeGetTime多媒體計時器,它可以提供毫秒級的計時。但這個精度對很多應(yīng)用場合而言還是太粗糙了。另一種是QueryPerformanceCount計數(shù)器,隨系統(tǒng)的不同可以提供微秒級的計數(shù)。對于實時圖形處理、多媒體數(shù)據(jù)流處理、或者實時系統(tǒng)構(gòu)造的程序員,善用QueryPerformanceCount/QueryPerformanceFrequenc
本文要介紹的,是另一種直接利用Pentium
在Intel
在Pentium以上的CPU中,提供了一條機(jī)器指令RDTSC(Read
inline
{
__asm
}
但是不行,因為RDTSC不被C++的內(nèi)嵌匯編器直接支持,所以我們要用_emit偽指令直接嵌入該指令的機(jī)器碼形式0X0F、0X31,如下:
inline |