测试程序的运行时间

C标准库(libc)接口及示例解析 libc(C标准库)是C语言程序的核心运行时库,提供了操作系统底层功能的封装和基础函数。它的“接口”指的是库向开发者暴露的、可直接调用的函数和API。不同操作系统的实现可能不同(如Linux的glibc、macOS的libSystem、Windows的CRT),但核心功能遵循C标准(如C11/C17)。 阅读详情
VC程序运行时间测试函数
2011-08-23 14:27

       最近在做足球机器人系统,笔者负责的是动态环境下机器人路径规划部分,用的是技术手段是"遗传算法+人工势场法",硬件平台是FIRA3VS3平台,软件平台主要是先借助MATLAB进行原理性验证,随后移植到VC平台上进行整机调试。路径规划时间较为重要,这直接关系到系统实时性的问题。在MATLAB下程序运行时间可以通过"tin+tout"的方式很方便的得出来,但是在VC下时间的得出并没有这么简单,下面是个人搜集的一些有关这方面的资料,整理了下,贴出来跟大家分享,希望对各位有所帮助!欢迎彼此讨论、交流、学习!

 

介绍

       我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数。还比如我们通过记录函数或者算法开始和截至的时间,然后利用两者之差得出函数或者算法的运行时间。编译器和操作系统为我们提供了很多时间函数,这些时间函数的精度也是各不相同的,所以,如果我们想得到准确的结果,必须使用合适的时间函数。现在我就介绍windows下的几种常用时间函数。

1:Sleep函数

使用:sleep(1000),在Windows和Linux下1000代表的含义并不相同,Windows下的表示1000毫秒,也就是1秒钟;Linux下表示1000秒,Linux下使用毫秒级别的函数可以使用usleep。

原理:sleep函数是使调用sleep函数的线程休眠,线程主动放弃时间片。当经过指定的时间间隔后,再启动线程,继续执行代码。Sleep函数并不能起到定时的作用,主要作用是延时。在一些多线程中可能会看到sleep(0);其主要目的是让出时间片。

精度:sleep函数的精度非常低,当系统越忙它精度也就越低,有时候我们休眠1秒,可能3秒后才能继续执行。它的精度取决于线程自身优先级、其他线程的优先级,以及线程的数量等因素。

2:MFC下的timer事件

       使用:1.调用函数SetTimer()设置定时间隔,如SetTimer(0,100,NULL)即为设置100毫秒的时间间隔;2.在应用程序中增加定时响应函数OnTimer(),并在该函数中添加响应的处理语句,用来完成时间到时的操作。

    原理:同sleep函数一样。不同的是timer是一个定时器,可以指定回调函数,默认为OnTimer()函数。

    精度:timer事件的精度范围在毫米级别,系统越忙其精度也就越差。

3:C语言下的Time

       使用:time_t t;time(&t);Time函数是获取当前时间。

    原理:time函数主要用于获取当前时间,比如我们做一个电子时钟程序,就可以使用此函数,获取系统当前的时间。

    精度:秒级别

4:COM对象中的COleDateTime,COleDateTimeSpan

    使用:COleDateTime start_time = COleDateTime::GetCurrentTime();

COleDateTimeSpan end_time = COleDateTime::GetCurrentTime()-start_time;
While(end_time.GetTotalSeconds() < 2)
{
// 处理延时或定时期间能处理其他的消息
DoSomething()
end_time = COleDateTime::GetCurrentTime-start_time;

}

原理:以上代表延时2秒,而这两秒内我们可以循环调用DoSomething(),从而实现在延时的时候我们也能够处理其他的函数,或者消息。COleDateTime,COleDateTimeSpan是MFC中CTime,CTimeSpan在COM中的应用,所以,上面的方法对于CTime,CTimeSpa同样有效。

       精度:秒级别

5:C语言下的时钟周期clock()

       使用:   clock_t start = clock();
              Sleep(100);
              clock_t end = clock();
          double d = (double)(start - end) / CLOCKS_PER_SEC;

       原理:clock()是获取计算机启动后的时间间隔。 

精度:ms级别,对于短时间内的定时或者延时可以达到ms级别,对于时间比较长的定时或者延迟精度还是不够。在windows下CLOCKS_PER_SEC为1000。

6:Windows下的GetTickCount()

使用:  DWORD start = GetTickCount();
        Sleep(100);
        DWORD end = GetTickCount();

原理:GetTickCount()是获取系统启动后的时间间隔。通过进入函数开始定时,到退出函数结束定时,从而可以判断出函数的执行时间,这种时间也并非是函数或者算法的真实执行时间,因为在函数和算法线程不可能一直占用CPU,对于所有判断执行时间的函数都是一样,不过基本上已经很准确,可以通过查询进行定时。GetTickCount()和Clock()函数是向主板BIOS要real time clock时间,会有中断产生,以及延迟问题。

精度:WindowsNT 3.5以及以后版本精度是10ms,它的时间精度比clock函数的要高,GetTickCount()常用于多媒体中。

7:Windows下timeGetTime

使用:需要包含Mmsystem.hWindows.h,加入静态库Winmm.lib.

timeBeginPeriod(1);
DWORD start = timeGetTime();
              Sleep(100);
          DWORD end = timeGetTime();

timeEndPeriod(1);

原理:timeGetTime也时常用于多媒体定时器中,可以通过查询进行定时。通过查询进行定时,本身也会影响定时器的定时精度。

精度:毫秒,与GetTickCount()相当。但是和GetTickCount相比,timeGetTime可以通过timeBeginPeriod,timeEndPeriod设置定时器的最小解析精度, timeBeginPeriod,timeEndPeriod必须成对出现。

8:windows下的timeSetEvent

使用:还记的VC下的Timer吗?Timer是一个定时器,而以上我们提到几种时间函数或者类型,实现定时功能只能通过轮训来实现,也就是必须另外创建一个线程单独处理,这样会影响定时精度,好在windows提供了内置的定时器timeSetEvent,函数原型为

MMRESULT timeSetEvent( UINT uDelay, //以毫秒指定事件的周期
UINT uResolution, //以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为1ms
LPTIMECALLBACK lpTimeProc, //指向一个回调函数
WORD dwUser, //存放用户提供的回调数据
UINT fuEvent )// 标志参数,TIME_ONESHOT:执行一次;TIME_PERIODIC:周期性执行

       具体应用时,可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在 lpFunction回调函数中(如:定时采样、控制等),从而完成所需处理的事件。需要注意的是:任务处理的时间不能大于周期间隔时间。另外,在定时器使用完毕后,应及时调用timeKillEvent()将之释放。

原理:可以理解为代回调函数的timeGetTime

精度:毫秒,timeSetEvent可以通过timeBeginPeriod,timeEndPeriod设置定时器的最小解析精度, timeBeginPeriod,timeEndPeriod必须成对出现。
9:高精度时控函数QueryPerformanceFrequency,QueryPerformanceCounter

使用:LARGE_INTEGER m_nFreq;
          LARGE_INTEGER m_nBeginTime;
          LARGE_INTEGER nEndTime;
     QueryPerformanceFrequency(&m_nFreq); // 
获取时钟周期
          QueryPerformanceCounter(&m_nBeginTime); // 获取时钟计数
          Sleep(100);
          QueryPerformanceCounter(&nEndTime);
     cout << (nEndTime.QuadPart-m_nBeginTime.QuadPart)*1000/m_nFreq.QuadPart << endl;

原理:CPU上也有一个计数器,以机器的clock为单位,可以通过rdtsc读取,而不用中断,因此其精度与系统时间相当。

精度:计算机获取硬件支持,精度比较高,可以通过它判断其他时间函数的精度范围。

10小结:以上提到常用的9种时间函数,由于他们的用处不同,所以他们的精度也不尽相同,所以如果简单的延时可以用sleep函数,稍微准确的延时可以使用clock函数,GetTickCount函数,更高级的实用timeGetTime函数;简单的定时事件可以用Timer,准确地可以用timeSetEvent;或取一般系统时间可以通time,或者CTime,或者COleDateTime,获取准确的时间可以用clock,或者GetTickCount函数,或者timeGetTime函数,而获取准确地系统时间要使用硬件支持的QueryPerformanceFrequency函数,QueryPerformanceCounter函数。

 

http://hi.baidu.com/20070210030205/blog/item/480fdd026affe59fd53f7ca1.html


Clock Tick 测试程序运行时间的函数 直接上代码,附详细注释 记住要放头文件和定义变量 #include <cstdio> #include <ctime> //单位是clock tick clock_t start,stop; // clock_t是clock()函数返回的变量类型 double duration; //记录被测函数的运行时间,单位秒 void MyFunction() { //C... 阅读详情

相关推荐

C++测试程序运行时间

关于优化 我们应当忘记小的性能优化,百分之九十七的情况下,过早的优化都是万恶之源 这句话在很多时候都被引用到,以至于&amp;quot;不要优化&amp;quot;(注意,是&amp;quot;不要优化&amp;quot;而不是“不要过早优化”)已经深入人心,过度地推崇这条建议经常会成为如下行为的借口 编程恶习 逃避性能分析 还有另一个常识:优化是不重要的,这条常识的理由,在&amp;amp;lt;unix编程哲学&amp;amp

Original_S的博客 3223

Windows时间函数大全

介绍       我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数。还比如我们通过记录函数或者算法开始和截至的时间,然后利用两者之差得出函数或者算法运行时间。编译器和操作系统为我们提供了很多时间函数,这些时间函数的精度也是各不相同的,所以,如果我们想得到准确的结果,必须使用合适的时

ugg的专栏 2万+

Windows时间片精度设置工具

SetCpuTimeSlice,自制工具,可以设置Windows下CPU精度1~16ms,用于提高CPU的调度频率。 注意:Win10-2004版本之后无法使用

Windows精确时间处理函数

由于最近测试函数的运行时间,可是发现系统提供的大多是以毫秒级的时间精度,而算法的执行(在没有选取大量数据的情况下)竟然在毫秒级内完成了。这让我花费了一段时间来查找新的Windows函数来获取当前的时间。 先介绍一下普通的函数: (1)使用C标准库(精确到秒级): #incl

鹏程万里--扬帆起航 6191

Windows下时间函数总结

Windows下时间函数总结         通过阅windows核心编程》和左丞的博客《http://blog.csdn.net/morewindows/article/details/6854764》,现在总结下Windows下时间函数和使用方法。 一. Windows平台下常用的计时函数         Windows平台下常用的计时函数,包括精度为秒、毫秒、微秒三

chenglinhust的专栏 2611

windows程序如何设计时间片_用户界面设计师,如何在应用程序上做创新设计?...

当设计师们有扎实的界面设计基础以及DS经历,做起界面行云流水,却发现我们的设计趋同性严重。当我们摒弃各个类别应用程序的TOP3logo,已然分不清谁是谁。那么应用程序上的界面创新即成为设计师们去思考以及实践的内容。用户界面设计师如何在应用程序设计上创新呢?本文基于职位工作内容从三个方面入手阐述创新思维。框架层打破原有的组件结构我们规范输出太多的按钮,标签栏,翻页,卡片等组件设计,在界面中习惯性把组...

weixin_39910963的博客 210

java测试程序运行时间

java测试程序运行时间,主要通过两个System.currentTimeMillis()之差获得:   Java代码 // 设置时间点time1 long time1 = System.currentTimeMillis(); /* 此处为测试的程序代码

gnolzhao的专栏 776

测试程序运行时间的方法

程序的性能好坏是由其运行时间和空间占用情况决定的,而运行时间是主要的指标。因此设计出新的算法时,根据时间复杂度确定新的算法和传统算法的优劣,此时需要在程序中添加代码段,测试程序运行时间。这里介绍两种测试程序运行时间的方法。 法1: #include #include #include int main() { int a[1000]; double duration; time_

CS练功房 924

用C语言测试程序运行时间,c语言测试程序执行时间

http://blog.csdn.NET/asaasa66/article/details/6543929测试程序运行时间-time.h1.计时C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下:clock_t clock( void );这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时...

weixin_32236671的博客 1485

测试程序运行时间

测试程序运行时间 精度:us 级别 #include <QDebug> #include <sys/time.h> struct timeval tpstart,tpend; float timeuse; gettimeofday(&tpstart,NULL); function(); gettimeofday(&tpend,NULL); timeus...

艾笑的博客 426

SQL Server如何测试程序运行时间

目的:测试程序运行时间,比较不同写法的运行时间,得出最优的写法 DECLARE @程序开始时间 VARCHAR(50) DECLARE @程序结束时间 VARCHAR(50) SELECT @程序开始时间 = CONVERT(VARCHAR(50), GETDATE(), 13) 这里是执行具体业务的代码 SELECT @程序结束时间 = CONVERT(VARCHAR(50), GETDA...

零的幂方 的博客 580

C++中几种测试程序运行时间的方法

C++中几种测试程序运行时间的方法

kevinshift的博客 942

程序调优中如何稳定地测试程序运行时间

程序调优中如何稳定地测试程序运行时间 计算代码段的运行时间 关于程序运行过程中,有效地测试程序运行时间有下面几个方法。 使用clock()函数进行程序运行时间统计 #include <stdio.h> #include <time.h> int main(int argc, char** argv) { clock_t start_cnt, end_cnt; ...

Xiaobai__Lee的博客 1071

C语言clock()函数测试程序运行时间

C语言clock()函数测试程序运行时间 分析算法时间复杂度时,有时需要测试函数执行时间。此时可以借助C语言提供的clock()函数。 clock()函数 捕捉从程序开始运行到clock()被调用所耗费的时间。这个时间单位是clock tick, 即“时钟打点”。 常数CLK_TCK 机器时钟每秒所走的时钟打点数,不同机器之间可能存在差异。 调用clock()记录函数执行时间 使用clock()时...

DarkSide_的博客 1207

Linux下测试程序运行时间

Linux下测试程序运行时间 简单写个小的知识点,测试代码的性能,测试代码执行的时间。 要包含头文件 #include "time.h" #include 代码如下:/*...............测试程序运行时间...................*/ time_t startT,endT; double totalT; startT = time(NULL)

feitianxuxue的专栏 5510

关于测试程序运行时间

要想准确测试程序运行时间,似乎是不可能完成的任务; 目前测量程序运行时间主要有两类方法,一种是基于计时器Timer的,另一种是基于计数器Counter的。 一:基于Timer的测量方法。 缺点:精度不够高,不能用于程序运行持续时间小于100ms的测量。 优点:准确性不是十分依赖于系统负载,并且在执行时间大于1s的程序上,与理论值之间的误差很低。 方法:在程序开始时取计时器的内容,在

Arcsinsin的学习笔记 1571
上一篇: USB转串口的问题
wxj_program
博客等级 码龄14年 1粉丝 1原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值