网摘和自己整理的,所以分类为翻译,请见谅。 不过当计算算法耗时的时候,不要忘记second,不能只要用Milliseconds来减,不然后出现负值,若是算法耗时太长就得用minutes啦。再不然,就hours……
//方案— 优点:仅使用C标准库;缺点:只能精确到秒级
//方案二 优点:能精确到毫秒级;缺点:使用了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 获取系统的计数器的频率 BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) 获取计数器的值 然后用两次计数器的差除以Frequency就得到时间。 7 Multimedia Timer Functions The following functions are used with multimedia timers. timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime //********************************************************************* //用标准C实现获取当前系统时间的函数
一.time()函数
#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 -- 必须的时间函数头文件 time_t -- 时间类型(time.h 定义是typedef long time_t; 追根溯源,time_t是long) struct tm -- 时间结构,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 ); -- 转为当地时间,tm 时间结构 asctime ()-- 转为标准ASCII时间格式: 星期 月 日 时:分:秒 年
----------------------------------------------------------------------------- 二.clock()函数,用clock()函数,得到系统启动以后的毫秒级时间,然后除以CLOCKS_PER_SEC,就可以换成“秒”,标准c函数。 clock_t clock ( void ); #include clock_t t = clock(); long sec = t / CLOCKS_PER_SEC; 他是记录时钟周期的,实现看来不会很精确,需要试验验证; --------------------------------------------------------------------------- 三.gettime(&t); 据说tc2.0的time结构含有毫秒信息 #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 是一个结构体,, 其中成员函数 ti_hund 是毫秒。。。
-------------------------------------------------------------------------------- 四.GetTickCount(),这个是windows里面常用来计算程序运行时间的函数; DWORD dwStart = GetTickCount(); //这里运行你的程序代码 DWORD dwEnd = GetTickCount(); 则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位 这个函数只精确到55ms,1个tick就是55ms。 -------------------------------------------------------------------------------- 五.timeGetTime()t,imeGetTime()基本等于GetTickCount(),但是精度更高 DWORD dwStart = timeGetTime(); //这里运行你的程序代码 DWORD dwEnd = timeGetTime(); 则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位 虽然返回的值单位应该是ms,但传说精度只有10ms。 ========================================= //*****************************************************************Unix ##unix时间相关,也是标准库的 //********************************************************************* 1.timegm函数只是将struct tm结构转成time_t结构,不使用时区信息; time_t timegm(struct tm *tm); 2.mktime使用时区信息 time_t mktime(struct tm *tm); timelocal 函数是GNU扩展的与posix函数mktime相当 time_t timelocal (struct tm *tm); 3.gmtime函数只是将time_t结构转成struct tm结构,不使用时区信息; struct tm * gmtime(const time_t *clock); 4.localtime使用时区信息 struct tm * localtime(const time_t *clock); 1.time获取时间,stime设置时间 time_t t; t = time(&t); 2.stime其参数应该是GMT时间,根据本地时区设置为本地时间; int stime(time_t *tp) 3.UTC=true 表示采用夏时制; 4.文件的修改时间等信息全部采用GMT时间存放,不同的系统在得到修改时间后通过localtime转换成本地时间; 5.设置时区推荐使用setup来设置; 6.设置时区也可以先更变/etc/sysconfig/clock中的设置再将ln -fs /usr/share/zoneinfo/xxxx/xxx /etc/localtime 才能重效 time_t只能表示68年的范围,即mktime只能返回1970-2038这一段范围的time_t 看看你的系统是否有time_t64,它能表示更大的时间范围 //***************************************************************windows ##Window里面的一些不一样的 //*********************************************************************
一.CTime () 类 VC编程一般使用CTime类 获得当前日期和时间
CTime t = GetCurrentTime(); SYSTEMTIME 结构包含毫秒信息 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);
//***************************** 获得当前日期和时间 CTime tm=CTime::GetCurrentTime(); CString str=tm.Format("%Y-%m-%d"); 在VC中,我们可以借助CTime时间类,获取系统当前日期,具体使用方法如下: CTime t = CTime::GetCurrentTime(); //获取系统日期,存储在t里面 int d=t.GetDay(); //获得当前日期 int y=t.GetYear(); //获取当前年份 int m=t.GetMonth(); //获取当前月份 int h=t.GetHour(); //获取当前为几时 int mm=t.GetMinute(); //获取当前分钟 int s=t.GetSecond(); //获取当前秒 int w=t.GetDayOfWeek(); //获取星期几,注意1为星期天,7为星期六
二.CTimeSpan类 如果想计算两段时间的差值,可以使用CTimeSpan类,具体使用方法如下: CTime t1( 1999, 3, 19, 22, 15, 0 ); CTime t = CTime::GetCurrentTime(); CTimeSpan span=t-t1; //计算当前系统时间与时间t1的间隔 int iDay=span.GetDays(); //获取这段时间间隔共有多少天 int iHour=span.GetTotalHours(); //获取总共有多少小时 int iMin=span.GetTotalMinutes();//获取总共有多少分钟 int iSec=span.GetTotalSeconds();//获取总共有多少秒
------------------------------------------------------------------------------
三._timeb()函数 _timeb定义在SYS\TIMEB.H,有四个fields dstflag millitm time timezone void _ftime( struct _timeb *timeptr ); struct _timeb timebuffer; _ftime( &timebuffer ); 取当前时间:文档讲可以到ms,有人测试,好象只能到16ms!
四.设置计时器 定义TIMER ID #define TIMERID_JISUANFANGSHI 2 在适当的地方设置时钟,需要开始其作用的地方; SetTimer(TIMERID_JISUANFANGSHI,200,NULL); 在不需要定时器的时候的时候销毁掉时钟 KillTimer(TIMERID_JISUANFANGSHI); 对应VC程序的消息映射 void CJisuan::OnTimer(UINT nIDEvent) {switch(nIDEvent)} --------------------------------------------------------------------------------------- ##如何设定当前系统时间---------------------------------------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博客,转载请标明出处:http://blog.csdn.net/khuang2008/archive/2008/12/09/3483274.aspx
一种制作微秒级精度定时器的方法 当使用定时器时,在很多情况下只用到毫秒级的时间间隔,所以只需用到下面的两种常用方式就满足要求了。一是用SetTimer函数建立一个定时器后,在程序中通过处理由定时器发送到线程消息队列中的WM_TIMER消息,而得到定时的效果(退出程序时别忘了调用和SetTimer配对使用的KillTimer函数)。二是利用GetTickCount函数可以返回自计算机启动后的时间,通过两次调用GetTickCount函数,然后控制它们的差值来取得定时效果,此方式跟第一种方式一样,精度也是毫秒级的。 用这两种方式取得的定时效果虽然在许多场合已经满足实际的要求,但由于它们的精度只有毫秒级的,而且在要求定时时间间隔小时,实际定时误差大。下面介绍一种能取得高精度定时的方法。
在一些计算机硬件系统中,包含有高精度运行计数器(high-resolution
1、首先调用QueryPerformanceFrequenc 2、在需要定时的代码的两端分别调用QueryPerformanceCounter以取得高精度运行计数器的数值n1,n2。两次数值的差值通过f换算成时间间隔,t=(n2-n1)/f。 下面举一个例子来演示这种方法的使用及它的精确度。
在VC
其中包含两个静态文本框,两个编辑框和两个按纽。上面和下面位置的编辑框的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 } 注:别忘了在头文件中为此函数添加函数声明。
至此,可以编译和执行此工程了,结果如上图所示。在本人所用的机上(奔腾366,
上面的函数由于演示测试的需要,没有在函数级封装,下面给出的函数基本上可以以全局函数的形式照搬到别的程序中。
BOOL /////////////////////////////////////////////////////////////////////////////////////////////////////////////
// {
BOOL
LARGE_INTEGER
if(!QueryPerformanceFrequenc {
::MessageBox(NULL,
"Not
return }
interval.QuadPart
bNormal
current
while(
bNormal
return }
需要指出的是,由于在此函数中的代码很多,机器在执行这些代码所花费的时间也很长,所以在需要几个微秒的延时时,会影响精度。实际上,读者在熟悉这种方法后,只要使用QueryPerformanceFrequenc
使用CPU时间戳进行高精度计时 对关注性能的程序开发人员而言,一个好的计时部件既是益友,也是良师。计时器既可以作为程序组件帮助程序员精确的控制程序进程,又是一件有力的调试武器,在有经验的程序员手里可以尽快的确定程序的性能瓶颈,或者对不同的算法作出有说服力的性能比较。
在Windows平台下,常用的计时器有两种,一种是timeGetTime多媒体计时器,它可以提供毫秒级的计时。但这个精度对很多应用场合而言还是太粗糙了。另一种是QueryPerformanceCount计数器,随系统的不同可以提供微秒级的计数。对于实时图形处理、多媒体数据流处理、或者实时系统构造的程序员,善用QueryPerformanceCount/QueryPerformanceFrequenc
本文要介绍的,是另一种直接利用Pentium
在Intel
在Pentium以上的CPU中,提供了一条机器指令RDTSC(Read
inline
{
__asm
}
但是不行,因为RDTSC不被C++的内嵌汇编器直接支持,所以我们要用_emit伪指令直接嵌入该指令的机器码形式0X0F、0X31,如下:
inline |