本节书摘来自异步社区《编程珠玑(续)(修订版)》一书中的第1章,第1.3节专用的性能监视工具,作者【美】Jon Bentley,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.3 专用的性能监视工具
到目前为止我们所看到的性能监视工具的原理,适用于从汇编和Fortran直到Ada这样的程序设计语言,但是很多程序员现在使用更强大的语言。如何监视Lisp或APL程序的计算性能?又如何监视网络或数据库语言程序的计算性能?
我们打算用UNIX的管道(pipeline)作为更有趣的计算模型的例子。管道是一系列的过滤程序(filter):当数据流经每个过滤程序时,对数据施加变换。下面这个经典的管道按照频率递减顺序打印某文件中使用最多的25个单词③。
cat $* ¦
tr -cs A-Za-z '\012' ¦
tr A-Z a-z ¦
sort ¦
uniq -c ¦
sort -r –n ¦
sed 25q
当用这个管道在一本大约6万字的书中寻找25个最常见的单词时,我们监视这个管道的性能。输出的前6行是:
3463 the
1855 a
1556 of
1374 to
1166 in
1104 and
...
下面是对VAX-11/750上计算的“管道性能监视”:
lines words chars times
10717 59701 342233 14.4u 2.3s 18r tr -cs A-Za-z \012
57652 57651 304894 11.9u 2.2s 15r tr A-Z a-z
57652 57651 304894 104.9u 7.5s 123r sort
57652 57651 304894 24.5u 1.6s 27r uniq –c
4731 9461 61830 27.0u 1.6s 31r sort -rn
4731 9461 61830 0.0u 0.2s 0r sed 25q
25 50 209
左边几列说明每个阶段的数据:行数、单词数、字符数。右边部分描述了数据阶段之间的过滤程序:用秒表示的用户时间、系统时间以及真实时间,后面是命令本身。
这个性能监视结果给出了程序员感兴趣的许多信息。这个管道是快速的,处理150页的书只需3.5分钟。第一次排序花了这个管道57%的运行时间,这种经过仔细调优的实用程序很难再提速了。第二次排序只花了这个管道14%的时间,但是还有调优的余地④。这个性能监视结果还发现了管道中隐藏的一处小错误。UNIX高手们会乐于找出引入空行的地方。
这个性能监视结果也透露了文件中单词的信息:共有57 651个单词,但只有4731个不同的单词。在第一个翻译程序之后,每个单词有4.3个字母。输出表明,最常见的单词是“the”,占了文件的6%。6个最常见的单词占了文件的18%。对英语中最常见的100个单词做专门处理也许还能提高速度。试试看从这些计数中找出其他有趣的表面规律。
跟许多UNIX用户一样,我过去也用手工监视管道的性能,利用单词计数(wc)命令来统计文件,用time命令来统计进程。“管道性能监视工具”让这个任务自动化了。用管道和一些输入文件的名称作为输入,产生性能监视结果作为输出。2个小时和50行代码就足以建立这个性能监视工具。下一节详细阐述这个话题。