测量程序执行时间·九

来源:互联网 发布:罗马2 兵种数据修改 编辑:程序博客网 时间:2024/06/09 18:48

第9章 测量程序执行时间

关键词:低频率计时器,计数器,高速缓存,周期计数器,预测转移
计算机用来记录时间的两种基本机制:一种基于低频率计时器(timer),它会周期性中断处理器;另一种基于计数器(counter),没个时钟周期计数器会加1.应用程序的程序员可以通过调用库函数获得对前一种计时机制的访问。

计算机系统上的时间流

CPE:每元素的周期数
从应用程序的角度出发,可以把时间看成两种时间段的交替,一种时间段里程序是活动的(在执行它的指令) ,另一种时间段里程序是不活动的(等待被操作系统调度)。
操作系统也用计时器来记录每个进程使用的累计时间,这种信息提供的是对程序执行时间不那么准确地测量值。
周期计数器(cycle counter)提供了一个非常精确的的工具,可以测量一个程序执行中两个不同点之间经过的时间。
虽然我们使用周期计时器测量容易受由上下文切换、高速缓存操作和转移预测引起的误差的影响,但是一个重要的特性就是这些误差总是导致过高地估计真实的执行时间。处理器做的事情都不会认为地加速一个程序的执行。即使上下文切换和其它影响会引起测量值不一致,我们仍然可以利用这个属性来获得执行时间可靠的测量值。

9.2 总述

计算机系统用来同时运行多个进程的机制使得很难获得程序性能可靠的测量值。系统活动倾向于在两个不同的时间尺度上进行。在微观级别上,每条指令执行的事假你是以ns来衡量的。在宏观级别上,输入/输出交互发生的延迟是以ms来衡量的。计算机系统通过不断地从一个任务切换到另一个人物来利用这种差异,一次运行若干ms。
计算机系统有两种完全不同的记录时间流失的方法。从宏观角度来看,计时器中断(timer interrupt)发生的频率似乎很快,但是从微观的角度来看却很慢。通过时间间隔技术(interval counting)系统能获得对程序执行时间的非常粗略的测量值。这种方法只对长持续时间(至少1s)的测量有用。周期计数器(cycle counter)非常快,可以得到在微观尺度上很好的测量值。对于测量绝对时间的周期计数器,上下文切换的影响能够导致很小(在负载很轻的系统上)到很大(在负载很重的系统上)的误差。因此,没有方法是完美的。理解在一个特殊的系统上能够获得的准确度是很重要的。
取决于前面存储器引用和条件转移的历史,高速缓存和转移预测的影响可以导致执行代码的某个片段所需的时间每次都不同。通过事先运行某些将高速缓存设置为可以预测状态的代码,我们可以部分地控制引起这种变化的因素,但是在有上下文切换发生时,这些尝试就是没有用的了。因此,我们必须进行多次测量,分析结果,以确定真实的执行时间。幸运的是,所有引起变化的因素的效果都是增加执行时间,因此只需确定测出的时间的最小值时都是一个准确的测量值。
通过一系列的实验,我们能够设计并且验证K次最优计时方法,我们反复进行测量,直到最快的K个值都在某个互相接近的范围之内了。在一些系统上,我们能够使测量用库函数来确定时间。在另一些系统上,我们必须通过汇编代码来访问周期计数器。
参考文献
布赖恩特, O'Hallaron D, et al. 深入理解计算机系统[M]. 中国电力出版社, 2004.
Bryant R, David Richard O H, David Richard O H. Computer systems: a programmer's perspective[M]. Upper Saddle River: Prentice Hall, 2003.
原创粉丝点击