網(wǎng)摘和自己整理的,所以分類為翻譯,請(qǐng)見諒。 不過當(dāng)計(jì)算算法耗時(shí)的時(shí)候,不要忘記second,不能只要用Milliseconds來減,不然后出現(xiàn)負(fù)值,若是算法耗時(shí)太長(zhǎng)就得用minutes啦。再不然,就hours……
//方案— 優(yōu)點(diǎn):僅使用C標(biāo)準(zhǔn)庫;缺點(diǎn):只能精確到秒級(jí)
//方案二 優(yōu)點(diǎn):能精確到毫秒級(jí);缺點(diǎn):使用了windows API //方案五,貌似這個(gè)也是兼容C/C++的
int64_t ts = systemTime(); 打印時(shí)候使用%ld
====================================================================================================
C語言中如何獲取時(shí)間?精度如何? 1 使用time_t time( time_t * timer ) 精確到秒 2 使用clock_t clock() 得到的是CPU時(shí)間精確到1/CLOCKS_PER_SEC秒 3 計(jì)算時(shí)間差使用double difftime( time_t timer1, time_t timer0 ) 4 使用DWORD GetTickCount() 精確到毫秒 5 如果使用MFC的CTime類,可以用CTime::GetCurrentTime() 精確到秒 6 要獲取高精度時(shí)間,可以使用
BOOL QueryPerformanceFrequenc 獲取系統(tǒng)的計(jì)數(shù)器的頻率 BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) 獲取計(jì)數(shù)器的值 然后用兩次計(jì)數(shù)器的差除以Frequency就得到時(shí)間。 7 Multimedia Timer Functions The following functions are used with multimedia timers. timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime //********************************************************************* //用標(biāo)準(zhǔn)C實(shí)現(xiàn)獲取當(dāng)前系統(tǒng)時(shí)間的函數(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í)間函數(shù)頭文件 time_t -- 時(shí)間類型(time.h 定義是typedef long time_t; 追根溯源,time_t是long) struct tm -- 時(shí)間結(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 ); -- 獲取時(shí)間,以秒計(jì),從1970年1月一日起算,存于rawtime localtime ( &rawtime ); -- 轉(zhuǎn)為當(dāng)?shù)貢r(shí)間,tm 時(shí)間結(jié)構(gòu) asctime ()-- 轉(zhuǎn)為標(biāo)準(zhǔn)ASCII時(shí)間格式: 星期 月 日 時(shí):分:秒 年
----------------------------------------------------------------------------- 二.clock()函數(shù),用clock()函數(shù),得到系統(tǒng)啟動(dòng)以后的毫秒級(jí)時(shí)間,然后除以CLOCKS_PER_SEC,就可以換成“秒”,標(biāo)準(zhǔn)c函數(shù)。 clock_t clock ( void ); #include clock_t t = clock(); long sec = t / CLOCKS_PER_SEC; 他是記錄時(shí)鐘周期的,實(shí)現(xiàn)看來不會(huì)很精確,需要試驗(yàn)驗(yà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 是一個(gè)結(jié)構(gòu)體,, 其中成員函數(shù) ti_hund 是毫秒。。。
-------------------------------------------------------------------------------- 四.GetTickCount(),這個(gè)是windows里面常用來計(jì)算程序運(yùn)行時(shí)間的函數(shù); DWORD dwStart = GetTickCount(); //這里運(yùn)行你的程序代碼 DWORD dwEnd = GetTickCount(); 則(dwEnd-dwStart)就是你的程序運(yùn)行時(shí)間, 以毫秒為單位 這個(gè)函數(shù)只精確到55ms,1個(gè)tick就是55ms。 -------------------------------------------------------------------------------- 五.timeGetTime()t,imeGetTime()基本等于GetTickCount(),但是精度更高 DWORD dwStart = timeGetTime(); //這里運(yùn)行你的程序代碼 DWORD dwEnd = timeGetTime(); 則(dwEnd-dwStart)就是你的程序運(yùn)行時(shí)間, 以毫秒為單位 雖然返回的值單位應(yīng)該是ms,但傳說精度只有10ms。 ========================================= //*****************************************************************Unix ##unix時(shí)間相關(guān),也是標(biāo)準(zhǔn)庫的 //********************************************************************* 1.timegm函數(shù)只是將struct tm結(jié)構(gòu)轉(zhuǎn)成time_t結(jié)構(gòu),不使用時(shí)區(qū)信息; time_t timegm(struct tm *tm); 2.mktime使用時(shí)區(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),不使用時(shí)區(qū)信息; struct tm * gmtime(const time_t *clock); 4.localtime使用時(shí)區(qū)信息 struct tm * localtime(const time_t *clock); 1.time獲取時(shí)間,stime設(shè)置時(shí)間 time_t t; t = time(&t); 2.stime其參數(shù)應(yīng)該是GMT時(shí)間,根據(jù)本地時(shí)區(qū)設(shè)置為本地時(shí)間; int stime(time_t *tp) 3.UTC=true 表示采用夏時(shí)制; 4.文件的修改時(shí)間等信息全部采用GMT時(shí)間存放,不同的系統(tǒng)在得到修改時(shí)間后通過localtime轉(zhuǎn)換成本地時(shí)間; 5.設(shè)置時(shí)區(qū)推薦使用setup來設(shè)置; 6.設(shè)置時(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,它能表示更大的時(shí)間范圍 //***************************************************************windows ##Window里面的一些不一樣的 //*********************************************************************
一.CTime () 類 VC編程一般使用CTime類 獲得當(dāng)前日期和時(shí)間
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)前日期和時(shí)間 CTime tm=CTime::GetCurrentTime(); CString str=tm.Format("%Y-%m-%d"); 在VC中,我們可以借助CTime時(shí)間類,獲取系統(tǒng)當(dāng)前日期,具體使用方法如下: CTime t = CTime::GetCurrentTime(); //獲取系統(tǒng)日期,存儲(chǔ)在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)前為幾時(shí) int mm=t.GetMinute(); //獲取當(dāng)前分鐘 int s=t.GetSecond(); //獲取當(dāng)前秒 int w=t.GetDayOfWeek(); //獲取星期幾,注意1為星期天,7為星期六
二.CTimeSpan類 如果想計(jì)算兩段時(shí)間的差值,可以使用CTimeSpan類,具體使用方法如下: CTime t1( 1999, 3, 19, 22, 15, 0 ); CTime t = CTime::GetCurrentTime(); CTimeSpan span=t-t1; //計(jì)算當(dāng)前系統(tǒng)時(shí)間與時(shí)間t1的間隔 int iDay=span.GetDays(); //獲取這段時(shí)間間隔共有多少天 int iHour=span.GetTotalHours(); //獲取總共有多少小時(shí) int iMin=span.GetTotalMinutes();//獲取總共有多少分鐘 int iSec=span.GetTotalSeconds();//獲取總共有多少秒
------------------------------------------------------------------------------
三._timeb()函數(shù) _timeb定義在SYS\TIMEB.H,有四個(gè)fields dstflag millitm time timezone void _ftime( struct _timeb *timeptr ); struct _timeb timebuffer; _ftime( &timebuffer ); 取當(dāng)前時(shí)間:文檔講可以到ms,有人測(cè)試,好象只能到16ms!
四.設(shè)置計(jì)時(shí)器 定義TIMER ID #define TIMERID_JISUANFANGSHI 2 在適當(dāng)?shù)牡胤皆O(shè)置時(shí)鐘,需要開始其作用的地方; SetTimer(TIMERID_JISUANFANGSHI,200,NULL); 在不需要定時(shí)器的時(shí)候的時(shí)候銷毀掉時(shí)鐘 KillTimer(TIMERID_JISUANFANGSHI); 對(duì)應(yīng)VC程序的消息映射 void CJisuan::OnTimer(UINT nIDEvent) {switch(nIDEvent)} --------------------------------------------------------------------------------------- ##如何設(shè)定當(dāng)前系統(tǒng)時(shí)間---------------------------------------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)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/khuang2008/archive/2008/12/09/3483274.aspx
一種制作微秒級(jí)精度定時(shí)器的方法 當(dāng)使用定時(shí)器時(shí),在很多情況下只用到毫秒級(jí)的時(shí)間間隔,所以只需用到下面的兩種常用方式就滿足要求了。一是用SetTimer函數(shù)建立一個(gè)定時(shí)器后,在程序中通過處理由定時(shí)器發(fā)送到線程消息隊(duì)列中的WM_TIMER消息,而得到定時(shí)的效果(退出程序時(shí)別忘了調(diào)用和SetTimer配對(duì)使用的KillTimer函數(shù))。二是利用GetTickCount函數(shù)可以返回自計(jì)算機(jī)啟動(dòng)后的時(shí)間,通過兩次調(diào)用GetTickCount函數(shù),然后控制它們的差值來取得定時(shí)效果,此方式跟第一種方式一樣,精度也是毫秒級(jí)的。 用這兩種方式取得的定時(shí)效果雖然在許多場(chǎng)合已經(jīng)滿足實(shí)際的要求,但由于它們的精度只有毫秒級(jí)的,而且在要求定時(shí)時(shí)間間隔小時(shí),實(shí)際定時(shí)誤差大。下面介紹一種能取得高精度定時(shí)的方法。
在一些計(jì)算機(jī)硬件系統(tǒng)中,包含有高精度運(yùn)行計(jì)數(shù)器(high-resolution
1、首先調(diào)用QueryPerformanceFrequenc 2、在需要定時(shí)的代碼的兩端分別調(diào)用QueryPerformanceCounter以取得高精度運(yùn)行計(jì)數(shù)器的數(shù)值n1,n2。兩次數(shù)值的差值通過f換算成時(shí)間間隔,t=(n2-n1)/f。 下面舉一個(gè)例子來演示這種方法的使用及它的精確度。
在VC
其中包含兩個(gè)靜態(tài)文本框,兩個(gè)編輯框和兩個(gè)按紐。上面和下面位置的編輯框的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ù)由于演示測(cè)試的需要,沒有在函數(shù)級(jí)封裝,下面給出的函數(shù)基本上可以以全局函數(shù)的形式照搬到別的程序中。
BOOL /////////////////////////////////////////////////////////////////////////////////////////////////////////////
// {
BOOL
LARGE_INTEGER
if(!QueryPerformanceFrequenc {
::MessageBox(NULL,
"Not
return }
interval.QuadPart
bNormal
current
while(
bNormal
return }
需要指出的是,由于在此函數(shù)中的代碼很多,機(jī)器在執(zhí)行這些代碼所花費(fèi)的時(shí)間也很長(zhǎng),所以在需要幾個(gè)微秒的延時(shí)時(shí),會(huì)影響精度。實(shí)際上,讀者在熟悉這種方法后,只要使用QueryPerformanceFrequenc
使用CPU時(shí)間戳進(jìn)行高精度計(jì)時(shí) 對(duì)關(guān)注性能的程序開發(fā)人員而言,一個(gè)好的計(jì)時(shí)部件既是益友,也是良師。計(jì)時(shí)器既可以作為程序組件幫助程序員精確的控制程序進(jìn)程,又是一件有力的調(diào)試武器,在有經(jīng)驗(yàn)的程序員手里可以盡快的確定程序的性能瓶頸,或者對(duì)不同的算法作出有說服力的性能比較。
在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/QueryPerformanceFrequenc
本文要介紹的,是另一種直接利用Pentium
在Intel
在Pentium以上的CPU中,提供了一條機(jī)器指令RDTSC(Read
inline
{
__asm
}
但是不行,因?yàn)镽DTSC不被C++的內(nèi)嵌匯編器直接支持,所以我們要用_emit偽指令直接嵌入該指令的機(jī)器碼形式0X0F、0X31,如下:
inline |