《编程珠玑(续)(修订版)》—第1章1.2节使用性能监视工具

1.2 使用性能监视工具
对于小程序来说,性能监视很容易实现,因此性能监视工具是可有可无的;但是对于开发大软件来说,性能监视工具则是不可或缺的。Brian Kernighan①曾经使用行计数性能监视工具,研究了一个用于解释Awk语言程序的4000行的C程序。那时这个Awk解释程序已广泛使用了多年。扫描该程序75页长的程序清单就会发现,大多数计数都是成百上千的,有些甚至上万。一段晦涩的初始化代码,计数接近百万。Kernighan对一个6行的循环做了几处修改,程序速度就提高了一倍。他自己可能永远也猜不出程序的问题源头所在,但是性能监视工具引导他找到了。

Kernighan的这一经历是相当典型的。在1.7节引用的论文中,Don Knuth②给出了Fortran程序许多方面(包括性能监视)的经验研究。该论文中有一个被经常引用(而且常常是被错误地引用)的命题:“一个程序中不到4%的语句通常占用了一半以上的运行时间。”对许多语言和系统的大量研究表明,对于不处理I/O密集型的大多数程序,大部分的运行时间花在了很小一部分代码上。这种模式是下述经验的基础:

Knuth在论文中描述了用行计数性能监视工具进行自我分析的结果。性能监视结果表明,一半的运行时间花在了两个循环上。结果花了不到一小时修改了几行代码,就让这个性能监视工具的速度提高了一倍。

第14章描述的性能监视结果说明,一个1000行的程序把80%的时间花在一个5行的子程序上。把这个子程序改写成十几行,就让程序的速度提高了一倍。

1984年贝尔实验室的Tom Szymanski打算给一个大系统提速,结果却使该系统慢了10%。他删除了修改的部分,然后多打开了一些性能监视选项以查明失败原因。他发现占用的存储空间增加到了原来的20倍,行计数显示存储空间的分配次数远多于释放次数。接下来用一条指令就纠正了错误,正确的实现让系统加速了一倍。

性能监视表明,操作系统一半的时间花在一个只有少数几条指令的循环上。改写微代码中的这个循环带来一个量级的提速,但是系统的吞吐量不变:性能组已经优化了系统的空闲循环!
这些经历引出了上一节粗略提到过的一个问题:应当在什么输入上监视程序的性能?查找素数的程序只有一个输入n,该输入强烈影响到时间性能监视:对于小的n,输入/输出占大头;对于大的n,计算占大头。有的程序的性能监视结果对输入数据非常不敏感。我猜想大多数计算薪水的程序都有相当一致的性能监视结果,至少从2月到11月如此。但有的程序的性能监视结果会随输入不同有巨大变化。难道你从没有察觉到,你的系统被调整得在制造商的基准数据上运行起来风驰电掣,而处理起你的重要任务时却慢如蜗牛?仔细挑选你的输入数据吧。

性能监视工具对于性能之外的任务也有用。在找素数的练习中,它指出了程序P4的一个错误。行计数在估计测试覆盖面时极有价值,比如,如果出现零,则说明有代码未测试。DEC公司的Dick Sites这样描述性能监视的其他用途:“(1) 在两层微存储实现中,决定哪些微代码放到芯片上;(2) 贝尔北方研究院(Bell Northern Research)的一位朋友某个周末在带有多重异步任务的实时电话交换软件系统上实现了语句计数。通过查看异常计数,他发现了现场安装的代码中存在6处错误,所有错误都涉及不同任务之间的交互。其中一处错误用常规调试技术无法成功追踪到,其余错误还没有被当作问题(也就是说,这些错误症状可能已经发生,但是没有人能够将其归结为具体的软件错误)。”

时间: 2024-07-30 12:29:55

《编程珠玑(续)(修订版)》—第1章1.2节使用性能监视工具的相关文章

《编程珠玑(续)(修订版)》—第1章1.4节开发性能监视工具

1.4 开发性能监视工具开发一个真正的性能监视工具是件困难的事情.Peter Weinberger⑤开发了C行计数性能监视工具,我们前面看到的输出就是这个工具产生的.他在几个月时间内断断续续干了好几周才完成这个项目.本节描述如何更容易地开发一个简化版本. Dick Sites声称他的朋友"在某个周末实现了语句计数".我觉得这简直难以置信,于是我决定要试着为附录A描述的Awk语言(这种语言还没有性能监视工具)开发一个性能监视工具.几小时后,当我运行程序P6的Awk版本时,我的性能监视工具

《软件工程(第4版?修订版)》—第2章2.3节过程建模工具和技术

2.3 过程建模工具和技术 软件工程(第4版•修订版) 一旦你决定了要从过程模型中得到什么,会有很多建模工具和技术可供选择.从前面章节模型的描述中,我们已经了解了一些建模的方法.选择的建模技术是否合适,取决于你的目标和喜欢的工作方式.尤其是,对表示法的选择取决于你想要用模型表示的内容.表示法可以是从文本到图形的各种方式.文本方式把过程表示为函数,图形方式把过程描述成由正方形和箭头组成的层次结构,图形和文本结合的方式把图形化的描述与表格和函数结合在一起,共同对过程从较高层次进行说明.许多建模表示法

《编程珠玑(续)(修订版)》—第1章1.1节计算素数

第1章 性能监视工具 编程珠玑(续)(修订版) 听诊器是一种简单工具,却给医生的工作带来了革命:它让内科医生能有效地监控病人的身体.性能监视工具(profiler)对程序起着同样的作用. 你现在用什么工具来研究程序?复杂的分析系统很多,既有交互式调试器,又有程序动画系统.正如CT扫描仪永远代替不了听诊器一样,复杂的软件也永远代替不了程序员用来监控程序的最简单工具--性能监视工具,我们用它了解程序各部分的执行频率. 本章先用两种性能监视工具来加速一个小程序(记住真正的目的是说明性能监视工具).后续

《编程珠玑(续)(修订版)》—第1章1.6节习题

1.6 习题 1.假设数组X[1..1000]中散布着随机实数.下面这个例程计算最小值和最大值: Max := Min := X[1] for I := 2 to 1000 do if X[I] > Max then Max := X[I] if X[I] < Min then Min := X[I] B. C. Dull先生注意到,如果一个元素是新的最大值,则这个元素不可能是最小值.因而他把两次比较写成 if X[I] > Max then Max := X[I] else if X[

《编程珠玑(续)(修订版)》目录—导读

内容提要 编程珠玑(续)(修订版) 本书是计算机科学方面的经典名著<编程珠玑>的姊妹篇,讲述了对于程序员有共性的知识.本书延续了<编程珠玑>的特色,通过一些精心设计的有趣而又颇具指导意义的程序,对实用程序设计技巧及基本设计原则进行透彻而睿智的描述,为复杂的编程问题提供清晰而完备的解决思路.书中涵盖了程序员操纵程序的技术.程序员取舍的技巧.输入和输出设计以及算法示例,这些内容结合成一个有机的整体,如一串串珠玑展示给程序员.本书对各个层次的程序员都具有很高的阅读价值. 版权声明 编程珠

编程珠玑--粗略估算

粗略估算是<编程珠玑>中第七章提到的内容.   这篇文章将"粗略估算"看做是一项工程技术,是程序员必备的一项技能之一. 本人非常同意这个观点.粗略估算是一种把复杂的事情简单化的能力.我们对某个算法的时间复杂度和空间复杂度的估算就是基于这种估算的能力.如果你能较为准确的估算出一个程序的输出结果,如果你能准确估算出这个程序的运行时间,如果你能准确估算出这个项目的开发时间--如果你能拥有这样的能力,该有多么美好啊.所以难怪乎像微软.Google这样的大公司老喜欢出"请计

《编程珠玑(续)(修订版)》—第2章2.1节Awk中的关联数组

第2章 关联数组编程珠玑(续)(修订版)人类学家说,语言深刻地影响了世界观.一般把这个观察结果称为"Whorf假说"① ,也经常把它总结为"语言塑造了人的思想". 跟大多数程序员一样,我使用的Algol系列的语言塑造了我的计算思维.对于像我这样的程序员来说,PL/1.C和Pascal看起来都很相似,我们不难把这样的代码翻译成COBOL或Fortran的代码.用这些语言能轻易地表达我们旧的.习以为常的思维模式. 另外一些语言则挑战了我们对于计算的看法.我们感到惊奇的是

《编程珠玑(第2版•修订版)》—第1章1.1节一次友好的对话

第一部分 基础 编程珠玑(第2版•修订版) 这一部分的5章回顾程序设计的基础知识.第1章介绍一个问题的历史,我们把仔细的问题定义和直接的程序设计技术结合起来,得到优美的解决方案.这一章揭示了本书的中心思想:对实例研究的深入思考不仅很有趣,而且可以获得实际的益处. 第2章讨论3个问题,其中重点强调了如何由算法的融会贯通获得简单而高效的代码.第3章总结数据结构在软件设计中所起到的关键作用. 第4章介绍一个编写正确代码的工具--程序验证.在第9章.第11章和第14章中生成复杂(且快速)的函数时,大量使

《编程珠玑(第2版•修订版)》—第2章2.1节三个问题

第2章 啊哈!算法 编程珠玑(第2版•修订版) 研究算法给实际编程的程序员带来许多好处.算法课教给学生完成重要任务的方法和解决新问题的技术.在后续的章节中将会看到,先进的算法工具有时候对软件系统影响很大--减少开发时间,同时使执行速度更快. 算法与其他那些深奥的思想一样重要,但在更一般的编程层面上具有更重要的影响.在<啊哈!灵机一动>一书中(本章的标题就借鉴了它),Martin Gardner①描述了深得我心的一个思想:"看起来很困难的问题也可以有一个简单的.意想不到的答案.&quo