摘要: 前言 人们经常会问:“程序X在机器Y上运行得有多快?”,而我们一般的回答都是给定一个可以估算出该程序执行时间的一个大概的描述,比如:程序在N分钟跑出了多少的数据;据此我们可以推测程序的运行性能。而 ...
5. K次最优测量方法 对于上述可能带来的误差,这些误差总是导致过高地估计真是的执行时间,但我们仍然有方法来获得执行时间可靠的测量值。在这里我们重复执行一个过程,记录K次最快的时间。如果我们发现这种测量误差∈很小,那么用测量的最快值来表示过程的真实执行时间就是合理的。 “k次最优(K-best)方法”。它要求设置三个参数: K:我们要求在某个接近最快值范围内的测量值数量。 ∈:这些测量必须有多大程度的接近。也就是如果测量值按照升序标号为v1,v2,v3….vn 那么我们要求(1+∈)v1>=vk M:在我们中止之前,测量值的最大数量 对于此方法,我们按照排序的方式维护者一个K个最快时间的数组,对于每个新的测量值,它会检查这个值是否比当前数组位置K中的值更快。如果是,它会替换数组元素K,然后执行一系列相邻数组之间的交换,将这个值移动到数组中适当的位置。继续这个过程,直到误差满足标准,此时我们称测量值已经”收敛了”,或者我们查过了界限M,此时我们称测量值不能收敛。 6. 基于gettimeofday函数的测量 这个库函数gettimeofday是用来查询系统时钟的,以确定当前的日期和时间,其定义如下: |
Struct timeval{Long tv_sec; /*seconds*/Long tv_usec; /*us*/}Intgettimeofday(struct timeval* tv,NULL); 这个函数把时间写入到一个调用者传过来的结构中,这个结构包括一个单位为s的字段和一个单位为us的字段。第一个字段存放的是自从1970年1月1日以来经过的总秒数。 据此方法我们也可以写相应的方法提供测量时间的接口:Static structtimeval tstart;Void start_timer(){Gettimeofday(&tstart,NULL);}Double get_timer(){Struct timeval tfinish;Long sec,usec;Gettimeofday(&tfinish,NULL);Sec = tfinish.tv_sec ? tstart.tv_sec;Usec = tfinish.tv_usc ?tstart.tv_usec;Return sec+1e-6*usec;} 到这里,基本上介绍了关于测量程序执行时间的大多数方法,我们可以根据需要在可接受误差范围内选定合适的方法,详细内容请参见<深入理解计算机系统>测量程序执行时间一章。