首页 测试 体会 查看内容

CSI-V:测试程序的执行时间

2014-4-25 15:52| 发布者: peter_zhang| 查看: 379| 评论: 0

摘要:   前言  人们经常会问:“程序X在机器Y上运行得有多快?”,而我们一般的回答都是给定一个可以估算出该程序执行时间的一个大概的描述,比如:程序在N分钟跑出了多少的数据;据此我们可以推测程序的运行性能。而 ...
Struct tms{Clock_ttms_utime;        //用户时间Clock_ttms_stime;       //系统时间Clock_ttms_cutime;    //已经终止了并且被回收的子进程使用的累计用户时间Clock_ttms_cstime;   //已经终止了并且被回收的子进程使用的累计系统时间};Clock_ttimes(struct tms* buf);  这些时间测量值是以时钟滴答为单位来表示的。定义的常数CLK_TCK指明每秒的时钟滴答数。时钟类型clock_t通常定义为长整型。times返回的是从系统启动开始已经经过的时钟滴答总数,因此我们可以通过两次调用times,再计算两个返回值的差,来计算一个程序执行中两个不同点之间的总时间。  和times方法类似,在WIN32平台下API GetTickCount也是返回自系统启动后的时钟滴答数。  其在MSDN中的定义如下:  DWORD GetTickCount(void);  调用GetTickCount返回的自系统启动以来流逝的毫秒(ms)数。还有其他类似的API如:  timeGetSystemTime和timeGetTime,具体说明请参考MSDN。  ANSI C标准定义的另一个函数clock:  Clock_t clock(void)  其返回值和times一样,都声明为clock_t类型,但是两个函数表达时间的单位不同,要将clock函数报告的时间变为秒数,必须把它除以定义好的常数CLOCK_PER_SEC。
  前言  人们经常会问:“程序X在机器Y上运行得有多快?”,而我们一般的回答都是给定一个可以估算出该程序执行时间的一个大概的描述,比如:程序在N分钟跑出了多少的数据;据此我们可以推测程序的运行性能。而很少有人去关注程序到底运行的准确时间,除非我们需要了解程序是否在优化后的性能提升程度,或者想比较两个相似算法的执行效率。这时我们可能需要测量出许多运行数据,来得到程序运行时的CPE(见CSI-VI)来进行观察比较。这时候我们就需要了解下如何来测试程序的执行时间。  首先,我们需要说明,计算机并不能测试出某一程序的绝对运行时间,这可能由诸多原因造成,最显然的就是程序在计算机中是并发执行的,因此进程间的切换可以导致一定的误差,同时还有高速缓存、处理器的分支预测等因素。所以不要指望一个程序每次执行的时间在计算机都是绝对相同的。在本篇中,我们学习两种记录时间流逝的机制:一种基于低频率计时器,它会周期性中断处理器;另一种基于计数器,每个时钟周期计数器会加1.  1.计算机系统上的时间流  计算机有两个时间尺度:  在微观级别,它们以每个时钟周期一条或者多条的速度执行指令,这里时钟周期只需要大约1ns(纳秒),这个跟机器的主频相关。  在宏观级别,就像人们通常所说和认可的,例如,图形显示器每33ms刷新一次,磁盘通常需要大约10ms来启动一次磁盘传送,处理器分配给每个任务的时间片大约为5~20ms以这样的速度,用户感觉上任务是同时进行的,因为人不能够察觉短于100ms的时间段。  2进程调度和计时器中断  计算机有一个外部计时器,它周期性地想处理器发送中断信号。这些中断信号之间的时间被称为间隔时间。当计时器中断发生时,操作系统调度程序可以选择要么继续当前正在执行的进程,要么切换到另一个进程。这个间隔必须设置得足够恰当,以保证提供同时执行多个任务的假象,同时不能太短而导致性能很差。典型的计时器间隔范围是1~10ms。  3通过间隔计数来测量时间  操作系统也用计时器来记录每个进程使用的累计时间,这种信息提供的是对程序执行时间不那么准备的测量值。让我们先看看下面的图:  看到这张图,我们先要明确一个事实:一个进程在其执行的过程中,一种时间段里程序是活动的(在运行它的指令),另一种时间段里程序是不活动的(等待被操作系统调用)。且程序活动的时间占用了整个执行时间绝大的百分比。  操作系统维护着每个进程使用的用户时间量和系统时间量的计数值,当计时器中断发生时,操作系统会确定那个进程是活动的,并且对那个进程的一个技术值增加计时器间隔时间。如果是在内核模式中执行的,那么就增加系统时间,否则增加用户时间。就像上图所标识的那样,进程A的用户和系统时间为Au和As,进程B的用户和系统时间为Bu和Bs,每个计时器中断都由被增加的计数值来标识。  为了获取进程的执行时间,我们可以调用库函数times来读取进程的计时器。函数声明如下:
123下一页

鲜花

握手

雷人

路过

鸡蛋

扫一扫关注最新动态

毒镜头:老镜头、摄影器材资料库、老镜头样片、摄影
爱评测 aipingce.com  
返回顶部