mm831网站源码分享,网站源码站

今天给各位分享mm831网站源码分享的知识,其中也会对网站源码站进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

听诊器是一种简单工具,却给医生的工作带来了革命:它让内科医生能有效地监控病人的身体。性能监视工具(profiler)对程序起着同样的作用。

你现在用什么工具来研究程序?复杂的分析系统很多,既有交互式调试器,又有程序动画系统。正如CT扫描仪永远代替不了听诊器一样,复杂的软件也永远代替不了程序员用来监控程序的最简单工具——性能监视工具,我们用它了解程序各部分的执行频率。

本文先用两种性能监视工具来加速一个小程序(记住真正的目的是说明性能监视工具)。后续各节简要介绍性能监视工具的各种用途、非过程语言的性能监视工具,以及开发性能监视工具的技术。

1计算素数

程序P1是个ANSI标准C程序,依次打印所有小于1000的素数。

程序P1

intprime(intn)\n{inti;\n999for(i=2;i<n;i++)\n78022if(n%i==0)\n831return0;\n168return1;\n}\nmain()\n{inti,n;\n1n=1000;\n1for(i=2;i<=n;i++)\n999if(prime(i))\n168printf(&34;,i);\n}

如果整型参数n是素数,上述prime函数返回1(真),否则返回0。这个函数检验2到n-1之间的所有整数,看其是否整除n。上述main过程用prime子程序来依次检查整数2~1000,发现素数就打印出来。

我像写任何一个C程序那样写好程序P1,然后在性能监视选项下进行编译。在程序运行之后,只要一个简单的命令就生成了前面所示的列表。(我稍微改变了一些输出的格式。)每行左侧的数由性能监视工具生成,用于说明相应的行执行了多少次。例如,main函数调用了1次,其中测试了999个整数,找出了168个素数。函数prime被调用了999次,其中168次返回1,另外831次返回0(快速验证:168+831=999)。prime函数共测试了78022个可能的因子,或者说为了确定素数性,对每个整数检查了大约78个因子。

程序P1是正确的,但是很慢。在VAX-11/750上,计算出小于1000的所有素数约需几秒钟,但计算出小于10000的所有素数却需要3分钟。对这些计算的性能监视表明,大多数时间花在了测试因子上。因而下一个程序只对n考虑不超过\\sqrtn的可能的整数因子。整型函数root先把整型参数转换成浮点型,然后调用库函数sqrt,最后再把浮点型结果转换回整型。程序P2包含两个旧函数和这个新函数root。

程序P2

introot(intn)\n5456{return(int)sqrt((float)n);}\n\nintprime(intn)\n{inti;\n999for(i=2;i<=root(n);i++)\n5288if(n%i==0)\n831return0;\n168return1;\n}\n\nmain()\n{inti,n;\n1n=1000;\n1for(i=2;i<=n;i++)\n999if(prime(i))\n168printf(&34;,i);\n}

修改显然是有效的:程序P2的行计数显示,只测试了5288个因子(程序P1的1/14),总共调用了5456次root(测试了5288次整除性,168次由于i超出了root(n)而终止循环)。不过,虽然计数大大减少了,但是程序P2运行了5.8秒,而程序P1只运行了2.4秒(本节末尾的表中含有运行时间的更多细节)。这说明什么呢?

迄今为止,我们只看到了行计数(line-count)性能监视。过程时间(procedure-time)性能监视给出了较少的控制流细节,但更多地揭示了CPU时间:

%timecumsecs34;%d\\n&39;\\012'|\ntrA-Za-z|\nsort|\nuniq-c|\nsort-r–n|\nsed25q

当用这个管道在一本大约6万字的书中寻找25个最常见的单词时,我们监视这个管道的性能。输出的前6行是:

3463the\n1855a\n1556of\n1374to\n1166in\n1104and\n…

下面是对VAX-11/750上计算的“管道性能监视”:

lineswordscharstimes\n107175970134223314.4u2.3s18rtr-csA-Za-z\\012\n576525765130489411.9u2.2s15rtrA-Za-z\n5765257651304894104.9u7.5s123rsort\n576525765130489424.5u1.6s27runiq–c\n473194616183027.0u1.6s31rsort-rn\n47319461618300.0u0.2s0rsed25q\n2550209

左边几列说明每个阶段的数据:行数、单词数、字符数。右边部分描述了数据阶段之间的过滤程序:用秒表示的用户时间、系统时间以及真实时间,后面是命令本身。

这个性能监视结果给出了程序员感兴趣的许多信息。这个管道是快速的,处理150页的书只需3.5分钟。第一次排序花了这个管道57%的运行时间,这种经过仔细调优的实用程序很难再提速了。第二次排序只花了这个管道14%的时间,但是还有调优的余地。这个性能监视结果还发现了管道中隐藏的一处小错误。UNIX高手们会乐于找出引入空行的地方。

这个性能监视结果也透露了文件中单词的信息:共有57651个单词,但只有4731个不同的单词。在第一个翻译程序之后,每个单词有4.3个字母。输出表明,最常见的单词是“the”,占了文件的6%。6个最常见的单词占了文件的18%。对英语中最常见的100个单词做专门处理也许还能提高速度。试试看从这些计数中找出其他有趣的表面规律。

跟许多UNIX用户一样,我过去也用手工监视管道的性能,利用单词计数(wc)命令来统计文件,用time命令来统计进程。“管道性能监视工具”让这个任务自动化了。用管道和一些输入文件的名称作为输入,产生性能监视结果作为输出。2个小时和50行代码就足以建立这个性能监视工具。下一节详细阐述这个话题。

4开发性能监视工具

开发一个真正的性能监视工具是件困难的事情。PeterWeinberger开发了C行计数性能监视工具,我们前面看到的输出就是这个工具产生的。他在几个月时间内断断续续干了好几周才完成这个项目。本节描述如何更容易地开发一个简化版本。

DickSites声称他的朋友“在某个周末实现了语句计数”。我觉得这简直难以置信,于是我决定要试着为附录A描述的Awk语言(这种语言还没有性能监视工具)开发一个性能监视工具。几小时后,当我运行程序P6的Awk版本时,我的性能监视工具生成了如下输出。

程序P6及性能监视工具生成的输出

BEGIN{<<<1>>>\nn=1000\nx[0]=2;xc=1\nprint2\nfor(i=3;i<=n;i++){<<<998>>>\nif(prime(i)){<<<167>>>\nprinti\n}\n}\nexit\n}\nfunctionprime(n,i){<<<998>>>\nfor(i=0;x[i]*x[i]<=n;i++){<<<2801>>>\nif(n%x[i]==0){<<<831>>>\nreturn0\n}\n}\n{<<<167>>>}\nx[xc++]=n\nreturn1\n}

在左花括号后尖括号内的数显示该语句块被执行了多少次。幸运的是,这些计数与C行计数器产生的计数一样。

我的性能监视工具包含两个5行的Awk程序。第一个程序读Awk源程序并且写一个新程序,其中在每个语句块开始的地方给不同的计数器加1;而在执行结束时,一个新的END动作(见附录A)把所有计数写入一个文件。当这样得出的程序运行时,就生成一个计数文件。第二个程序读出这些计数,把这些计数合并到源文本中。带性能监视的程序大约比原来的程序慢25%,而且并不是所有的Awk程序都能正确处理——为了监视几个程序的性能,我不得不做出整行(one-line)的修改。但对于所有这些缺点来说,搭起一个能运行的性能监视工具,花几小时并不算什么大投入。

人们实现过一些快速性能监视工具,但鲜见报道。下面举几个例子。

在1983年8月的BYTE杂志上,Leas和Wintz描述了一个性能监视工具,用一个20行的6800汇编语言程序来实现。

贝尔实验室的HowardTrickey在一小时内用Lisp实现了函数计数,办法是修改defun,在进入每个函数时给计数器加1。

1978年,RobPike用20行Fortran程序实现了一个时间性能监视工具。在CALLPROFIL(10)之后,后续的CPU时间被计入计数器10。

在这些系统和许多其他系统上,在一晚上写出一个性能监视工具是可能的。在你第一次使用所得到的性能监视工具时,这个工具轻易就能节省超过一个晚上的工作量。

5原理

本文只浮光掠影地介绍了性能监视。我介绍了最基础的内容,忽略了搜集数据的其他方式(比如硬件监视器)和其他显示方式(比如动画系统)。本文所要传达的信息同样是基本的。

使用性能监视工具。让本月成为性能监视工具月。请在随后几周内至少监视一个程序片段的性能,并且鼓励你的伙伴们也这样做。记住,当一个程序员屈尊来帮助一个小程序时,并不总是高瞻远瞩的。开发性能监视工具。如果你还没有方便的性能监视工具,就自造一个吧。大多数系统都提供基本的性能监视操作。20世纪60年代不得不观察控制台灯光来获得信息的程序员,现在可从个人工作站的图形窗口获得同样的信息。一个小程序通常足以把系统的命令特性包装成方便的工具。

本文节选自《编程珠玑(续)(修订版)》

内容简介

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

关于mm831网站源码分享和网站源码站的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平