注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

回首望星辰

See you in the next world

 
 
 

日志

 
 

VC获取系统时间、程序运行时间  

2009-04-21 16:51:40|  分类: 软件开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1.使用CTime类
CString str;
//获取系统时间
CTime tm;
tm=CTime::GetCurrentTime();
str=tm.Format("现在时间是%Y年%m月%d日 %X");
MessageBox(str,NULL,MB_OK);

2: 得到系统时间日期(使用GetLocalTime)

SYSTEMTIME st;
CString strDate,strTime;
GetLocalTime(&st);
strDate.Format("%4d-%2d-%2d",st.wYear,st.wMonth,st.wDay);
strTime.Format("%2d:%2d:%2d",st.wHour,st.wMinute,st.wSecond);

3.使用GetTickCount
//获取程序运行时间
long t1=GetTickCount();//程序段开始前取得系统运行时间(ms)
Sleep(500);
long t2=GetTickCount();();//程序段结束后取得系统运行时间(ms)
str.Format("time:%dms",t2-t1);//前后之差即 程序运行时间
AfxMessageBox(str);
//获取系统运行时间
long t=GetTickCount();
CString str,str1;
str1.Format("系统已运行 %d时",t/3600000);
str=str1;
t%=3600000;
str1.Format("%d分",t/60000);
str+=str1;
t%=60000;
str1.Format("%d秒",t/1000);
str+=str1;
AfxMessageBox(str);


如何在VC6.0中得到一个程序的运行时间,也就是这个程序耗费的时钟周期数// C和C++的时间编程
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
time_t begin,end;
begin=clock();
//这里加上你的代码
end=clock();
cout<<"runtime: "<<double(end-begin)/CLOCKS_PER_SEC<<endl;
}  
  


unix时间相关,也是标准库的
这些在<time.h>
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,它能表示更大的时间范围


Window里面的一些不一样的
CTime MFC类,好像就是把time.h封了个类,没扩展
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);

------------------------------------------------------------------------------
_timeb定义在SYS\TIMEB.H,有四个fields
dstflag
millitm
time
timezone

void _ftime( struct _timeb *timeptr );
struct _timeb timebuffer;
   _ftime( &timebuffer );
取当前时间:文档讲可以到ms,有人测试,好象只能到16ms!


-------------------------------------------------------------------------
如何设定当前系统时间---windows
SYSTEMTIME m_myLocalTime,*lpSystemTime;
    m_myLocalTime.wYear=2003;
    m_myLocalTime.wMonth=1;
    m_myLocalTime.wDay=1;
    m_myLocalTime.wHour=0;
    m_myLocalTime.wMinute=0;
    m_myLocalTime.wSecond=0;
    m_myLocalTime.wMilliseconds=0;
    lpSystemTime=&m_myLocalTime;
    if( SetLocalTime(lpSystemTime) ) //此处换成 SetSystemTime( )也不行
       MessageBox("OK !");
    else
       MessageBox("Error !");


SYSTEMTIME m_myLocalTime,*lpSystemTime;
m_myLocalTime.wYear=2003;
m_myLocalTime.wMonth=1;
m_myLocalTime.wDay=1;
lpSystemTime=&m_myLocalTime;
if( SetDate(lpSystemTime) ) //此处换成 SetSystemTime( )也不行
    MessageBox("OK !");
else
    MessageBox("Error !");


-----------------------------------------------------------------------------
用clock()函数,得到系统启动以后的毫秒级时间,然后除以CLOCKS_PER_SEC,就可以换成“秒”,标准c函数。
clock_t clock ( void );

#include <time.h>
clock_t t = clock();
long sec = t / CLOCKS_PER_SEC;
他是记录时钟周期的,实现看来不会很精确,需要试验验证;

---------------------------------------------------------------------------
据说tc2.0的time结构含有毫秒信息
#include   <stdio.h>
#include   <dos.h>

int main(void)
{
   struct time t;

   gettime(&t);
   printf("The current time is: %2d:%02d:%02d.%02d\n",
          t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);
   return 0;
}
time 是一个结构体,, 其中成员函数 ti_hund 是豪秒。。。上程序可以在tc2.0运行

--------------------------------------------------------------------------------
这个是windows里面常用来计算程序运行时间的函数;
DWORD dwStart = GetTickCount();

//这里运行你的程序代码
DWORD dwEnd = GetTickCount();
则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位
这个函数只精确到55ms,1个tick就是55ms。

--------------------------------------------------------------------------------
timeGetTime()基本等于GetTickCount(),但是精度更高
DWORD dwStart = timeGetTime();

//这里运行你的程序代码
DWORD dwEnd = timeGetTime();
则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位
虽然返回的值单位应该是ms,但传说精度只有10ms。
--------------------------------------------------------------------------------


Borland C++ Builder VCL的时间函数
  1. Date
  返回TDateTime对象,包含当前的年月日信息,函数原型如下:
  System::TDateTime __fastcall Date(void);

  2. Time
  返回TDateTime对象,包含当前的时间信息,函数原型如下:
  System::TDateTime __fastcall Time(void);

  3. Now
  返回TDateTime对象,获取当前的日期和时间信息,函数原型如下:
  System::TDateTime __fastcall Now(void);

  4. DatetimeToString
  将TDateTime对象转换为指定格式的字符串对象,函数原型如下:
  void __fastcall DateTimeToString(AnsiString &;Result, const AnsiString Format,System::TDateTime DateTime);

  5. DateToStr
  将TDateTime对象(包含当前年月日信息)转换为字符串对象,函数原型如下:
  AnsiString __fastcall DateToStr(System::TDateTime Date);

  6. TimeToStr
  将当前日期转换为字符串对象,函数原型如下:
  AnsiString __fastcall TimeToStr(System::TDateTime Time);

  7. DateTimetoStr
  将TDateTime对象转换为字符串对象,函数原型如下:
  AnsiString __fastcall DateTimeToStr(System::TDateTime DateTime);

  8. StrToDate
  将字符串对象转换为年月日对象,函数原型如下:
  System::TDateTime __fastcall StrToDate(const AnsiString S);

  9. StrToTime
  将字符串对象转换时间对象,函数原型如下:
  System::TDateTime __fastcall StrToTime(const AnsiString S);

  10.StrToDateTime
  将字符串对象转换为年月日时间对象,函数原型如下:
  System::TDateTime __fastcall StrToDateTime(const AnsiString S);

  11.DateTimeToSystemTime
  将TDateTime对象转换为操作系统时间,函数原型如下:
  void __fastcall DateTimeToSystemTime(System::TDateTime DateTime, _SYSTEMTIME &;SystemTime);

  12.SystemTimeToDateTime
  将操作系统时间转换为TDateTime对象,函数原型如下:
  System::TDateTime __fastcall SystemTimeToDateTime(const _SYSTEMTIME &;SystemTime);



---------------------------------------------------------------------------------------
下面是转的一个用汇编的精确计时方法
---------------------------------------------------------------------------------------
如何获得程序或者一段代码运行的时间?你可能说有专门的程序测试工具,确实,不过你也可以在程序中嵌入汇编代码来实现。

在Pentium的指令系统中有一条指令可以获得CPU内部64位计数器的值,我们可以通过代码两次获取该计数器的值而获得程序或代码运行的时钟周期数,进而通过你的cpu的频率算出一个时钟周期的时间,从而算出程序运行的确切时间。
我们通过指令TDSIC来获得cpu内部计数器的值,指令TDSIC返回值放在EDX:EAX中,其中EDX中存放64位寄存器中高32位的值,EAX存放第32位的值.
下面看看实现的代码:
//用汇编实现获取一段代码运行的时间
#include<iostream>

using namespace std;
void GetClockNumber (long high, long low);
void GetRunTime();

int main()
{  

long HighStart,LowStart,HighEnd,LowEnd;
long numhigh,numlow;
//获取代码运行开始时cpu内部计数器的值
__asm        
{
RDTSC
mov HighStart, edx
mov LowStart, eax
}
for(int i= 0; i<100000; i++ )
{
       for(int i= 0; i<100000; i++ )
   {
    
   }

}
//获取代码结束时cpu内部计数器的值,并减去初值
    __asm
{
RDTSC
mov HighEnd, edx
Mov LowEnd, eax
;获取两次计数器值得差
sub eax, LowStart
cmp eax, 0    ; 如果低32的差为负则求返,因为第二次取得永远比第一次的大
jg   L1
neg   eax
jmp   L2
      L1: mov numlow, eax
      L2: sbb edx, HighStart
mov numhigh, edx

}
    //把两个计数器值之差放在一个64位的整形变量中
    //先把高32位左移32位放在64的整形变量中,然后再加上低32位
__int64 timer =(numhigh<<32) + numlow;
     //输出代码段运行的时钟周期数
     //以频率1.1Gcpu为例,如果换计算机把其中的1.1改乘其它即可,因为相信大家的cpu都应该在1G以上 ^_^
cout<< (double) (timer /1.1/1000000000) << endl;
return 0;
}


   这样通过一条简单的汇编指令就可以获得程序或一段代码的大概时间,不过并不能得到运行的确切时间,因为即使去掉中间的循环,程序也会有个运行时间,
因为在第一次取得计数器的值后,有两条汇编指令mov HighStart, edx    mov LowStart, eax这两条指令当然也有运行时间 ,当然你可以减去这两条指令的运行时间(在1.1G的机子上是3e-8s),这样会更精确一点。
如果你要确切知道程序的运行时间,专业的测试软件肯定会更好一点,不过好像一般没有必要获取除非专门的要求的程序。
不过能DIY一个也是不错的,不管有没有,最起码你可以学到在VC++中如何嵌入汇编代码以及如何使用32位的寄存器,其实和16位的寄存器一样使用,将来64的也应该一样,只不过位数不同罢了
===================================

Q:如何获取时间?精度如何?                                                                  

A:
1 使用time_t time( time_t * timer )    精确到秒
  计算时间差使用double difftime( time_t timer1, time_t timer0 )

2 使用clock_t clock() 得到的是CPU时间    精确到1/CLOCKS_PER_SEC秒

3 使用DWORD GetTickCount() 得到的是系统运行的时间 精确到毫秒

4 如果使用MFC的CTime类,可以用CTime::GetCurrentTime() 精确到秒

5 要获取高精度时间,可以使用
    BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)获取系统的计数器的频率
    BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)获取计数器的值
    然后用两次计数器的差除以Frequency就得到时间。

6 还有David的文章中提到的方法:
    Multimedia Timer Functions
    The following functions are used with multimedia timers.
    timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime
    timeGetTime/timeKillEvent/TimeProc/timeSetEvent  精度很高 

 

Q:GetTickCount()函数,说是毫秒记数,是真的吗,还是精确到55毫秒?

A:
GetTickCount()和GetCurrentTime()都只精确到55ms(1个tick就是55ms)。如果要精确到毫秒,应该使用timeGetTime函数或QueryPerformanceCounter函数。具体例子可以参考QA001022 "VC++中使用高精度定时器"QA001813 "如何在Windows实现准确的定时"QA004842 "timeGetTime函数延时不准"

  评论这张
 
阅读(3292)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017