本节书摘来自异步社区《编程珠玑(续)(修订版)》一书中的第1章,第1.3节专用的性能监视工具,作者【美】jon bentley,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.3 专用的性能监视工具
到目前为止我们所看到的性能监视工具的原理,适用于从汇编和fortran直到ada这样的程序设计语言,但是很多程序员现在使用更强大的语言。如何监视lisp或apl程序的计算性能?又如何监视网络或数据库语言程序的计算性能?
我们打算用unix的管道(pipeline)作为更有趣的计算模型的例子。管道是一系列的过滤程序(filter):当数据流经每个过滤程序时,对数据施加变换。下面这个经典的管道按照频率递减顺序打印某文件中使用最多的25个单词③。
当用这个管道在一本大约6万字的书中寻找25个最常见的单词时,我们监视这个管道的性能。输出的前6行是:
下面是对vax-11/750上计算的“管道性能监视”:
左边几列说明每个阶段的数据:行数、单词数、字符数。右边部分描述了数据阶段之间的过滤程序:用秒表示的用户时间、系统时间以及真实时间,后面是命令本身。
这个性能监视结果给出了程序员感兴趣的许多信息。这个管道是快速的,处理150页的书只需3.5分钟。第一次排序花了这个管道57%的运行时间,这种经过仔细调优的实用程序很难再提速了。第二次排序只花了这个管道14%的时间,但是还有调优的余地④。这个性能监视结果还发现了管道中隐藏的一处小错误。unix高手们会乐于找出引入空行的地方。
这个性能监视结果也透露了文件中单词的信息:共有57 651个单词,但只有4731个不同的单词。在第一个翻译程序之后,每个单词有4.3个字母。输出表明,最常见的单词是“the”,占了文件的6%。6个最常见的单词占了文件的18%。对英语中最常见的100个单词做专门处理也许还能提高速度。试试看从这些计数中找出其他有趣的表面规律。
跟许多unix用户一样,我过去也用手工监视管道的性能,利用单词计数(wc)命令来统计文件,用time命令来统计进程。“管道性能监视工具”让这个任务自动化了。用管道和一些输入文件的名称作为输入,产生性能监视结果作为输出。2个小时和50行代码就足以建立这个性能监视工具。下一节详细阐述这个话题。