C++ 获取代码运行时间的各种方法

C++ 获取代码运行时间的各种方法
C++ 获取代码运行时间的各种方法

C++获取代码运行时间

如何获取代码运行时间在调试中,经常需要计算某一段代码的执行时间,下面给出两种常用的方式:

第一种:使用GetTickCount函数

#include

#include

int main()

{

DWORD start_time=GetTickCount();

{

//此处为被测试代码

}

DWORD end_time=GetTickCount();

cout<<"The run time is:"<<(end_time-start_time)<<"ms!"<

return 0;

} GetTickCount函数返回从系统运行到现在所经历的时间(类型为DWORD),单位为ms,因为DWORD表示范围的限制,所以使用此种方法存在限制,即系统的运行时间的ms表示不能超出DWORD的表示范围。

第二种:使用cl ock()函数

#include

#include

int main()

{

clock_t start_time=clock();

{

//被测试代码

}

clock_t end_time=clock();

cout<< "Running time is: "<(end_time-start_time)/CLOCKS_PER_SEC*1000<<"ms"<

return 0;

} clock_t,clock()定义于time.h中,clock()返回从程序运行时刻开始的时钟周期数,类型为long.CLOCKS_PER_SEC定义了每秒钟包含多少了时钟单元数,因为计算ms,所以*1000。

由上面分析可知,用clock()函数计算运行时间,表示范围一定大于GetTickCount()函数,所以,建议使用clock()函数。

=============================================================================== 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

#include

using namespace std;

int main()

{

time_t begin,end;

begin=clock();

//这里加上你的代码

end=clock();

cout<<"runtime: "<

}

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,它能表示更大的时间范围

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

clock_t t = clock();

long sec = t / CLOCKS_PER_SEC;

他是记录时钟周期的,实现看来不会很精确,需要试验验证;

---------------------------------------------------------------------------

据说tc2.0的time结构含有毫秒信息

#include

#include

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

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的也应该一样,只不过位数不同罢

显示系统时间运行时间的程序详解

S7200+TD400C显示系统时间、运行时间的程序详解 楼主??发帖时间:2007-7-21 15:46:00 ?????????? 看见论坛上有些朋友对西门子TD文本显示器显示时钟的问题比较关心,在这个帖子里笔者给出一个已经应用于工程上的程序例子,并作出详细分析,希望对关心这个问题的朋友有些帮助。 ????这个程序是S7200+TD400C显示系统时间、当班运行时间、累计运行时间的例子。 ??1楼回复时间:2007-7-21 16:02:00 系统硬件配置如下: ????PLC:西门子S7-200?CN;CPU?226?CN?REL?02.01;AC100~230V电源/DC24V 输入/继电器输出;订货号6ES7?216-2BD23-0XB8;固件02.01?Build?2;ASIC:01.00。 ????文本显示器:TD400C;订货号6AV6 6640-0AA00-0AX0;自带9芯TD/CPU电缆;版本:1.0.0.3。 ????S7-200与TD400C通过TD400C随机配置的TD/CPU通信电缆连接,实现电源供给和通信(因为当TD400C与S7-200?CPU之间的距离小于?2.5米时,采用 TD/CPU电缆的方式进行供电;当TD400C与S7-200?CPU之间的距离超过2.5米时,使用外部电源供电并使用PROFIBUS组件连接网络)。 ??2楼回复时间:2007-7-21 16:12:00 系统软件配置如下: ????S7-200参数设置:在“系统块”的“断电数据保持”中设置VW1600以后2000个单元为断电数据保持。 ????TD400C参数设置: ????????TD400C地址:1 ????????CPU地址:2 ????????参数块地址:0 ????????波特率:9.6K ????????HSA:31 ????????GUF:10 ????????键盘声音反馈:开 ????????屏幕保护时间:10分钟 S7-200的系统时钟调整为准确的北京时间。 ??3楼回复时间:2007-7-21 16:15:00 下面先写一下该程序所用到的存储器的意义,以便于理解程序。 本班运行时间:小时VW1600、分钟VW1604、秒VW1608; 累计运行时间:小时VW1620、分钟VW1624、秒VW1628; 系统时间(BCD码字节):年VB2000、月VB2001、日VB2002、小时VB2003、分钟VB2004、秒VB2005、星期VB2007; 系统时间(整数):?????年VW1644、月VW1648、日VW1652、小时VW1656、分钟VW1660、秒VW1664; 本班设备开始运行时间:小时VW1680、分钟VW1684、秒VW1688; 本班设备最后运行时间:小时VW1700、分钟VW1704、秒VW1708; 上班时间设置:小时VW1720、分钟VW1724;

Matlab中计算程序运行时间的三种方法

Matlab中计算程序运行时间的三种方法 经常我们需要计算我们程序到底运行多长时间,这样可以比较程序的执行效率。当然这个对于只有几秒钟的小程序没有什么意义,但是对于大程序就有很重要的意义了。 下面我们就说说Matlab中计算程序运行时间的三种常用方法吧! 注意:三种方法由于使用原理不一样,得到结果可能有一定的差距! 1、tic和toc组合(使用最多的) 计算tic和toc之间那段程序之间的运行时间,它的经典格式为 1. tic 2. 。。。。。。。。。。 3. toc 复制代码 换句话说程序,程序遇到tic时Matlab自动开始计时,运行到toc时自动计算此时与最近一次tic之间的时间。这个有点拗口,下面我们举个例子说明 1. % by dynamic of Matlab技术论坛 2. % see also https://www.360docs.net/doc/ad1968691.html, 3. % contact me matlabsky@https://www.360docs.net/doc/ad1968691.html, 4. % 2009-08-18 12:08:47 5. clc 6. tic;%tic1 7. t1=clock; 8. for i=1:3 9. tic ;%tic2 10. t2=clock; 11. pause(3*rand) 12. %计算到上一次遇到tic的时间,换句话说就是每次循环的时间 13. disp(['toc计算第',num2str(i),'次循环运行时间:',num2str(toc)]); 14. %计算每次循环的时间 15. disp(['etime计算第',num2str(i),'次循环运行时间:',num2str(etime(clock,t2))]); 16. %计算程序总共的运行时间 17. disp(['etime计算程序从开始到现在运行的时间:',num2str(etime(clock,t1))]); 18. disp('======================================') 19. end 20. %计算此时到tic2的时间,由于最后一次遇到tic是在for循环的i=3时,所以计算 的是最后一次循环的时间 21. disp(['toc计算最后一次循环运行时间',num2str(toc)]) 22. disp(['etime程序总运行时间:',num2str(etime(clock,t1))]); 复制代码 运行结果如下,大家可以自己分析下 1. toc计算第1次循环运行时间: 2.5628 2. etime计算第1次循环运行时间:2.562

单片机C延时时间怎样计算

C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时 应该使用unsigned char作为延时变量。以某晶振为12MHz的单片 机为例,晶振为12M H z即一个机器周期为1u s。一. 500ms延时子程序 程序: void delay500ms(void) { unsigned char i,j,k; for(i=15;i>0;i--) for(j=202;j>0;j--) for(k=81;k>0;k--); } 计算分析: 程序共有三层循环 一层循环n:R5*2 = 81*2 = 162us DJNZ 2us 二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值 1us = 3us 三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值 1us = 3us

循环外: 5us 子程序调用 2us + 子程序返回2us + R7赋值 1us = 5us 延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms 计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5 二. 200ms延时子程序 程序: void delay200ms(void) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=132;j>0;j--) for(k=150;k>0;k--); } 三. 10ms延时子程序 程序: void delay10ms(void) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=4;j>0;j--) for(k=248;k>0;k--);

c++程序计时

C++运行时间的代码 如何获取代码运行时间在调试中,经常需要计算某一段代码的执行时间,下面给出两种常用的方式: 第一种:使用GetTickCount函数 #include #include int main() { DWORD start_time=GetTickCount(); { //此处为被测试代码} DWORD end_time=GetTickCount(); cout<<"The run time is:"<<(end_time-start_time)<<"ms!"< #include int main() { clock_t start_time=clock(); { //被测试代码} clock_t end_time=clock(); cout<< "Running time is: "<(end_time-start_time)/CLOCKS_PER_SEC*1000<<"ms"<

CCS查看DSP程序运行时间

CCS查看DSP程序运行时间 2008-09-04 19:35 1.进入CCS环境,装载已有工程,并load生成的.out文件,并找到要察看代码执行周期的代码处。如图1所示。 图1 1.选择ccs的菜单Profiler中的enable clock,如图所示。 图2 2.选择Profiler菜单下的clock setup子菜单,并在Instruction Cycle中输入你的DSP时钟周期,它的单位为纳秒,例如,2407的系统时钟为40MHz,你就该填入25,如果是2812系统时钟为150MHz,就该填入6.67ns,其他配置不动,然后确定。如图3所示。

图3 3.选择Profiler菜单下的Start New Session子菜单,出现如图4所示的对话框,可以改名字,也可以不改,本例中不修改,直接确定。 图4 4.通过第四部设定后就出现了如图5所示的一个窗体。 这个窗体中,有四个选项卡,其中Files为以源文件列出统计数据,Functions选项卡用于剖析程序中的函数,Ranges 用于剖析一段连续的代码,Setup用于设置开始点和结束点,用于剖析不连续的代码。 窗体的左边按钮的含义为:(这里介绍主要的) 剖析所有的函数。 建立剖析区域。 设置开始点。 设置结束点。 在窗体中剖析数据有一个表格,用红框圈起来的,每个表格的字段名的含义为: Code size:剖析代码的大小,以程序存储器最小可寻址单元为单位,此值在剖析过程中不会发生变化。 Incl. Count:在统计过程中,程序运行进入剖析代码段的次数

Incl. Total: 在统计工程中剖析代码段消耗的所有时钟周期(如果是统计时钟周期的话,CCS还可以统计子程序调用等其他计数,统计其他特性则显示相应的值)。 Incl. Maximum: 执行剖析代码段一遍(包括在剖析代码段中对子程序的调用)消耗的最大时钟周期(由于每次进入剖析代码段的初始条件不同等原因,每次运行剖析代码段消耗的时钟周期可能不同); Incl. Minimum: 执行剖析代码段一遍(包括在剖析代码段中对子程序的调用)消耗的最小时钟周期 Incl. Average: 剖析代码段执行一遍(包括在剖析代码段中对子程序的调用)消耗的平均时钟周期。-- 以上这三个就是用户关心的代码执行的时钟周期。 Excl. Count:在统计过程中,程序运行进入剖析代码段的次数,与Incl.Count的值相同。 Excl. Maximum: 剖析代码段执行一遍(不包括在剖析代码段中对子程序的调用)消耗的最大时钟周期。 Excl. Minimum: 剖析代码段执行一遍(不包括在剖析代码段中对子程序的调用)消耗的最小时钟周期。 Excl. Average: 剖析代码段执行一遍(不包括在剖析代码段中对子程序的调用)消耗的平均时钟周期。 5.以剖析函数为例,找到该函数,然后将光标放在该函数的函数名上,选择建立剖析区域按钮,图中用红框框起来的那个按钮。如图6所示。 图六。 6.出现对话框,如图7所示,因为我们做的是function,所以不用修改,如果做的是一段代码,只要把下拉菜单里的function改成Range即可。

vc++获取系统时间和程序运行时间

内容: 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函数延时不准"。 Q:vc++怎样获取系统时间,返回值是什么类型的变量呢? GetSystemTime返回的是格林威志标准时间 GetLocalTime,和上面用法一样,返回的是你所在地区的时间,中国返回的是北京时间VOID GetSystemTime( LPSYSTEMTIME lpSystemTime // address of system time structure ); 函数就可以获得了,其中LPSYSTEMTIME 是个结构体 含:年,月,日,周几,小时,分,秒,毫秒。 以下是Time的MSDN文档: Compatibility in the Introduction. Libraries LIBC.LIBSingle thread static library, retail versionLIBCMT.LIBMultithread static library, retail versionMSVCRT.LIBImport library for MSVCRT.DLL, retail version Return Value time returns the time in elapsed seconds. There is no error return. Parameter timer Storage location for time Remarks

Qt系统运行时间差计算

Qt系统运行时间差计算 在网上查了很多资料,发觉网上很多用Qt写的系统运行时间差的例子写的都不是很全,今天自己研究了一下,可以成功得显示日时分秒,觉得不错,就与大家分享了 #include #include #include int main(int argc,char*argv[]) { QCoreApplication a(argc,argv); QDateTime now=QDateTime::currentDateTime(); QDateTime Moon_Festival; QDateTime xmas(QDate(now.date().year(),7,26),QTime(0,0)); //QDate(now.date().year()取当前的年分,可以自己设置,比如2012 Moon_Festival=xmas; //这里最大计数为天 //这里涉及到两个函数daysTo()和SecsTo(),他们分别返回差值的天数和秒数,如果有朋友需要精确到毫秒的,QDateTime还提供了一个msecsTo() qDebug()<start(1000);//设置更新时间间隔 timeFlag=1; } }

C与汇编程序运行时间比较

C与汇编程序运行时间比较 1. 程序简介 分别采用C语言和汇编语言多次对大量数据进行冒泡排序,比较并分析在数据量不同时二者所用时间的不同。 2. 流程图 3. 代码实现 #include"stdio.h" #include"stdlib.h" #include"time.h" #include"stdafx.h" //void srand (unsigned int seed); void bubble(int * d, long num);

void *malloc(unsigned int size); void free(void *p); int main() { double t=0.00; int k,i,j,temp; int* p; clock_t start=0,end=0; printf("要求数组的大小:\n"); scanf("%d",&k); p=(int*)malloc(k*sizeof(int)); srand((int)time(0)); for(i=0;ip[j+1]) { temp=p[j]; p[j]=p[j+1]; p[j+1]=temp; } } } end=clock(); t=(double)(end-start)*1000.00/CLOCK_PER_SEC; printf("在C语言中%d个数据冒泡排序共耗时%lf毫秒\n",k,t); //汇编语言中的冒泡排序 for(i=0;i

计算程序运行时间 time t clock t

计算程序运行时间time t clock t 计算程序运行时间(time_t,clock_t) 转载我们有时需要得到程序的运行时间,但我们也要知道,根本不可能精 确测量某一个程序运行的确切时间,文献中说的很明白,现摘录如下。 我们平时常用的测量运行时间的方法并不是那么精确的,换句话说,想精 确获取程序运行时间并不是那么容易的。也许你会想,程序不就是一条条指令么,每一条指令序列都有固定执行时间,为什么不好算?真实情况下,我们的计算机并不是只运行一个程序的,进程的切换,各种中断,共享的多用户,网络 流量,高速缓存的访问,转移预测等,都会对计时产生影响。 文献中还提到:对于进程调度来讲,花费的时间分为两部分,第一是计时 器中断处理的时间,也就是当且仅当这个时间间隔的时候,操作系统会选择, 是继续当前进程的执行还是切换到另外一个进程中去。第二是进程切换时间, 当系统要从进程A切换到进程B时,它必须先进入内核模式将进程A的状态保存,然后恢复进程B的状态。因此,这个切换过程是有内核活动来消耗时间的。具体到进程的执行时间,这个时间也包括内核模式和用户模式两部分,模式之 间的切换也是需要消耗时间,不过都算在进程执行时间中了。 那么有哪些方法能统计程序的运行时间呢?通过查找一些资料并结合自己的实践体会,摘录和总结了下面几种方法。 一、Linux的time命令 Linux系统下统计程序运行实践最简单直接的方法就是使用time命令,文 献[1,2]中详细介绍了time命令的用法。此命令的用途在于测量特定指令执行 时所需消耗的时间及系统资源等资讯,在统计的时间结果中包含以下数据: 实际时间(real time):从命令行执行到运行终止的消逝时间; 用户CPU时间(user CPU time):命令执行完成花费的系统CPU时间,即命令在用户态中执行时间的总和;

如何用vc 获取系统时间和程序运行时间

标题:如何用vc++获取系统时间和程序运行时间 出处:春天的事业 时间:Mon, 22 Jun 2009 17:34:26 +0000 作者:xiechunye 地址:https://www.360docs.net/doc/ad1968691.html,/read.php/612.htm 内容: 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函数延时不准"。 Q:vc++怎样获取系统时间,返回值是什么类型的变量呢? GetSystemTime返回的是格林威志标准时间 GetLocalTime,和上面用法一样,返回的是你所在地区的时间,中国返回的是北京时间VOID GetSystemTime( LPSYSTEMTIME lpSystemTime // address of system time structure ); 函数就可以获得了,其中LPSYSTEMTIME 是个结构体 含:年,月,日,周几,小时,分,秒,毫秒。 以下是Time的MSDN文档: Compatibility in the Introduction. Libraries LIBC.LIBSingle thread static library, retail versionLIBCMT.LIBMultithread static library, retail versionMSVCRT.LIBImport library for MSVCRT.DLL, retail version

程序执行时间计算_微秒级计数

1 需要取得系统精确时钟函数: 1)对于一般的实时控制,使用GetTickCount()函数就可以满足精度要求,但要进一步提高计时精度,就要采用QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数。 2)这两个函数是VC提供的仅供Windows 9X使用的高精度时间函数,并要求计算机从硬件上支持高精度计时器。 3)QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数的原型为: BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency); BOOL QueryPerformanceCounter(LARGE_INTEGER *lpCount); 数据类型LARGE—INTEGER既可以是一个作为8字节长的整型数,也可以是作为两个4字节长的整型数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下: typedef union _LARGE_INTEGER { struct { DWORD LowPart; // 4字节整型数 LONG HighPart; // 4字节整型数 }; LONGLONG QuadPart; // 8字节整型数 } LARGE_INTEGER; 4)在进行计时之前,应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。笔者在三种PentiumⅡ机器上使用该函数,得到的时钟频率都是1193180Hz。接着,笔者在需要严格计时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。 以下程序是用来测试函数Sleep(100)的精确持续时间。LARGE—INTEGER litmp; LONGLONG QPart1,QPart2; double dfMinus, dfFreq, dfTim; QueryPerformanceFrequency(&litmp); // 获得计数器的时钟频率 dfFreq = (double)litmp.QuadPart; QueryPerformanceCounter(&litmp); // 获得初始值 QPart1 = litmp.QuadPart;

C++ 获取代码运行时间的各种方法

C++获取代码运行时间 如何获取代码运行时间在调试中,经常需要计算某一段代码的执行时间,下面给出两种常用的方式: 第一种:使用GetTickCount函数 #include #include int main() { DWORD start_time=GetTickCount(); { //此处为被测试代码 } DWORD end_time=GetTickCount(); cout<<"The run time is:"<<(end_time-start_time)<<"ms!"< #include int main() { clock_t start_time=clock(); { //被测试代码 } clock_t end_time=clock(); cout<< "Running time is: "<(end_time-start_time)/CLOCKS_PER_SEC*1000<<"ms"<

CCS查看DSP程序运行时间

CCS查看DSP程序运行时间 1.进入CCS环境,装载已有工程,并load生成的.out文件,并找到要察看代码执行周期的代码处。如图1所示。 图1 1.选择ccs的菜单Profiler中的enable clock,如图所示。 图2 2.选择Profiler菜单下的clock setup子菜单,并在Instruction Cycle中输入你的DSP时钟周期,它的单位为纳秒,例如,2407的系统时钟为40MHz,你就该

填入25,如果是2812系统时钟为150MHz,就该填入6.67ns,其他配置不动,然后确定。如图3所示。 图3 3.选择Profiler菜单下的Start New Session子菜单,出现如图4所示的对话框,可以改名字,也可以不改,本例中不修改,直接确定。 图4 4.通过第四部设定后就出现了如图5所示的一个窗体。 这个窗体中,有四个选项卡,其中Files为以源文件列出统计数据,Functions选项卡用于剖析程序中的函数,Ranges用于剖析一段连续的代码,Setup用于设置开始点和结束点,用于剖析不连续的代码。 窗体的左边按钮的含义为:(这里介绍主要的) 剖析所有的函数。 建立剖析区域。 设置开始点。

设置结束点。 在窗体中剖析数据有一个表格,用红框圈起来的,每个表格的字段名的含义为:Code size:剖析代码的大小,以程序存储器最小可寻址单元为单位,此值在剖析过程中不会发生变化。 Incl. Count:在统计过程中,程序运行进入剖析代码段的次数 Incl. Total: 在统计工程中剖析代码段消耗的所有时钟周期(如果是统计时钟周期的话,CCS还可以统计子程序调用等其他计数,统计其他特性则显示相应的值)。Incl. Maximum: 执行剖析代码段一遍(包括在剖析代码段中对子程序的调用)消耗的最大时钟周期(由于每次进入剖析代码段的初始条件不同等原因,每次运行剖析代码段消耗的时钟周期可能不同); Incl. Minimum: 执行剖析代码段一遍(包括在剖析代码段中对子程序的调用)消耗的最小时钟周期 Incl. Average: 剖析代码段执行一遍(包括在剖析代码段中对子程序的调用)消耗的平均时钟周期。-- 以上这三个就是用户关心的代码执行的时钟周期。 Excl. Count:在统计过程中,程序运行进入剖析代码段的次数,与Incl.Count的值相同。 Excl. Maximum: 剖析代码段执行一遍(不包括在剖析代码段中对子程序的调用)消耗的最大时钟周期。 Excl. Minimum: 剖析代码段执行一遍(不包括在剖析代码段中对子程序的调用)消耗的最小时钟周期。 Excl. Average: 剖析代码段执行一遍(不包括在剖析代码段中对子程序的调用)消耗的平均时钟周期。 5.以剖析函数为例,找到该函数,然后将光标放在该函数的函数名上,选择建立剖析区域按钮,图中用红框框起来的那个按钮。如图6所示。

代码运行时间的三种测量方法

算法,Linux,编程语言,笔试面试 分类: 【热门技术】 2012-05-07 23:23 120人阅读 评论(0) 收藏举报 一,返回单位为毫秒 #include DWORD dwStart = GetTickCount(); // 测试代码 DWORD dwTime = GetTickCount() - dwStart; 注意:GetTickCount()精确度有限,跟CPU有关,一般精确度在16ms左右,最精确也不会精确过10ms,这就是说如果你的时间间隔在16ms以内的话,两个时间相减为0,如果大于16ms且小于32ms的话,两个时间相减为16ms(也不完全严格,有的时候会是15或者17,根据当时CPU的处理情况而定)。其实也就是说你得到的这个差是实际时间间隔除以 16(具体是几取决于你机器的处理能力,但是不会小于10),把余数舍弃。 二,返回时间为秒 #include unsigned long start,stop; start=time(NULL); //取值为秒 //你的程序 stop=time(NULL); printf("运行时间:%ld",stop-start); 三,精确计时法 QueryPerformanceCounter()这个函数返回高精确度性能计数器的值,它可以以微妙为单位 计时.但是 QueryPerformanceCounter()确切的精确计时的最小单位是与系统有关的,所以,必 须 要 查 询 系 统 以 得 到 QueryPerformanceCounter() 返 回 的 嘀 哒 声 的 频 率.QueryPerformanceFrequency()提供了这个频率值,返回每秒嘀哒声的个数.计算确切的时 间是从第一次调用 QueryPerformanceCounter()开始的 使用 window 操作系统本身提供的 API 接口,程序如下: #include LARGE_INTEGER Freq; LARGE_INTEGER start; LARGE_INTEGER end; QueryPerformanceFrequency(&Freq); // 获取时钟周期 QueryPerformanceCounter(&start); // 获取时钟计数 你的程序 QueryPerformanceCounter(&end); /*此处*1000,以毫秒为单位;*1000000 以微秒为单位*/ /*由于执行时间极短(可能是几微秒),所以采用微秒为单位*/ printf("%d",(end.QuadPart-start.QuadPart)*1000000/Freq.QuadPart); 注意:1s=10^3ms(毫秒)=10^6μs(微秒)=10^9ns(纳秒)=10^12ps(皮秒)=10^15fs(飞秒)=10^18as(阿秒)=10^21zm(仄秒)=10^24ym(幺秒) 例子: #include #include int main() { LARGE_INTEGER Freq; //64位有符号整数值. LARGE_INTEGER start; LARGE_INTEGER end; QueryPerformanceFrequency(&Freq); // 获取时钟周期 “1次/秒”,记做Hz(赫兹)。1Hz就是每秒一次

测量c++程序运行时间

C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下: clock_t clock( void ); 这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock)。其中clock_t是用来保存时间的数据类型,在time.h文件中,我们可以找到对它的定义: #ifndef _CLOCK_T_DEFINED typedef long clock_t; #define _CLOCK_T_DEFINED #endif 很明显,clock_t是一个长整形数。在time.h文件中,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,其定义如下: #define CLOCKS_PER_SEC ((clock_t)1000) 可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。下面举个例子,你可以使用公式clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间: void elapsed_time() { printf("Elapsed time:%u secs."n",clock()/CLOCKS_PER_SEC); } 当然,你也可以用clock函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间: #include “stdio.h” #include “stdlib.h”

#include “time.h” int main( void ) { long i = 10000000L; clock_t start, finish; double duration; /* 测量一个事件持续的时间*/ printf( "Time to do %ld empty loops is ", i ); start = clock(); while( i-- ) ; finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; printf( "%f seconds"n", duration ); system("pause"); } 在笔者的机器上,运行结果如下: Time to do 10000000 empty loops is 0.03000 seconds 上面我们看到时钟计时单元的长度为1毫秒,那么计时的精度也为1毫秒,那么我们可不可以通过改变CLOCKS_PER_SEC的定义,通过把它定义的大一些,从而使计时精度更高呢?通过尝试,你会发现这样是不行的。在标准C/C++中,最小的计时单位是一毫秒。

Keil uVision精确测量代码运行时间

Keil uVision精确测量代码运行时间 2016-3-19 woodpark 首先对Jlink仿真机进行设置,方法如下: 1、点击“Target Option...”快捷按钮 2、在弹出的对话框中选择“Debug”标签,选取Jlink仿真机后点击“Settings”按钮 3、弹出“Target Driver Setup”对话框,在“Debug”标签页选择当前采用的仿真机接口模 式(JTAG/SW,如果都支持的话尽量使用SW模式,工作会更可靠,多个程序可以共享SW接口)和合适的通信速率。

JTAG调试接口 SWD调试接口 4、继续点击对话框中的“Trace”标签页。勾选“Enable”选项,在“Core”编辑框中填入 待调试MCU的实际工作时钟频率(这点很重要,MDK会用它来计算时间)。如果是前面选择了SW接口,请同时勾选“Autodetect max SW0 Clock”。否则,选择了JTAG接口的话,在设置好Core时钟频率后,还需要去掉刚才勾选的“Enable”(目的是为了修改Core 时钟频率)。图中表示测试板完成初始化运行后MCU的主频为180MHz。点击“确定” 退出。到此为止,已经完成了仿真机部分的配置。

JTAG接口模式(注意:最后要取消勾选的Enable) SW接口 5、点击进行联机调试。 6、打开“Registers Window”以便MDK及时刷新系统运行时间。

系统运行时间 如果仅仅观看系统运行时间,上述设置就可以满足要求了。如果要知道某段程序运行的时间,就请继续往下看。 7、移动鼠标到MDK底部状态栏的运行时间上,点击鼠标右键弹出下面的选项。可以看出 MDK可以管理显示3个时间t0、t1、t2。其中,t0为累计的开机运行时间,不可以清零; t1和t2可以清零,用来测量某段代码的运行时间。下面选择t1进行时间测量。 8、为了测量某段代码的运行时间,可以先在代码开始的地方暂停下来,按照步骤7将t1 复位清零 9、在代码最后设置断点,全速运行。当程序停止运行时,t1显示了代码的实际运行时间。

CCS上程序运行时间统计方法最终报告

(1)根据C6000编译手册上所说,使用clock()函数。(2)DSP/BIOS下的时间分析器。(3)使用DSP片上自带的时钟。 (1)clock()函数使用:要加头文件:time.h,并在菜单栏profile----clock------enable点击 使用时,先定义:clock_t start,stop,substraction; start=clock(); stop=clock(); substraction=stop-start; 然后: start=clock(); ..........要检测的程序段.................... stop=clock(); printf("the cycle spended is %d\n",stop-start-substraction); 完成 但是,很可能这样做最后显示结果是0,这跟所使用的DSP芯片和开发板RTS有关,所以并不是所有人都能使用的。 (2)用片上的硬件定时器,最准确不过了。设置方法也很简单。如果你没有把片上的三个定时器全部用光的话,可以试试这种方法。下面的例子是以DM642芯片为例,跟其它芯片的主要区别是分频比不同而已,下文我会说到,这里使用timer0。 加头文件:csl_timer.h,加了这个头文件后,它会自动添加头文件csl_timerhal.h, 定义变量:句柄:TIMER_Handle hTimer0; 最终的循环数:unsigned int baitime; 一个结构体: TIMER_Config baiConfig = { TIMER_CTL_RMK ( TIMER_CTL_SPND_EMUSTOP, TIMER_CTL_INVINP_NO, TIMER_CTL_CLKSRC_CPUOVR8, TIMER_CTL_CP_PULSE, TIMER_CTL_HLD_NO, TIMER_CTL_GO_NO, TIMER_CTL_PWID_TWO, TIMER_CTL_DATOUT_1, TIMER_CTL_INVOUT_YES, TIMER_CTL_FUNC_TOUT ), 0xffffffff, 0x0 };

相关文档
最新文档