…………………………………………………………Page 681……………………………………………………………
java_g …prof sun。applet。AppletViewer applet。html
理解评测程序的输出信息并不容易。事实上,在JDK 1。0 中,它居然将方法名称截短为30 字符。所以可能无
法区分出某些方法。然而,若您用的平台确实能支持…prof 选项,那么可试试 Vladimir Bulatov 的
“HyperPorf”'3'或者Greg White 的“ProfileViewer ”来解释一下结果。
D。2。3 特殊工具
如果想随时跟上性能优化工具的潮流,最好的方法就是作一些 Web 站点的常客。比如由Jonathan Hardwick
制作的“Tools for Optimizing Java”(Java 优化工具)网站:
http://cs。cmu。edu/~jch/java/tools。html
D。2。4 性能评测的技巧
由于评测时要用到系统时钟,所以当时不要运行其他任何进程或应用程序,以免影响测试结果。
如对自己的程序进行了修改,并试图(至少在开发平台上)改善它的性能,那么在修改前后应分别测
试一下代码的执行时间。
尽量在完全一致的环境中进行每一次时间测试。
如果可能,应设计一个不依赖任何用户输入的测试,避免用户的不同反应导致结果出现误差。
D。3 提速方法
现在,关键的性能瓶颈应已隔离出来。接下来,可对其应用两种类型的优化:常规手段以及依赖Java 语言。
D。3。1 常规手段
通常,一个有效的提速方法是用更现实的方式重新定义程序。例如,在《Programming Pearls 》(编程拾
贝)一书中'14',Bentley 利用了一段小说数据描写,它可以生成速度非常快、而且非常精简的拼写检查
器,从而介绍了Doug McIlroy 对英语语言的表述。除此以外,与其他方法相比,更好的算法也许能带来更大
的性能提升——特别是在数据集的尺寸越来越大的时候。欲了解这些常规手段的详情,请参考本附录末尾的
“一般书籍”清单。
D。3。2 依赖语言的方法
为进行客观的分析,最好明确掌握各种运算的执行时间。这样一来,得到的结果可独立于当前使用的计算
机——通过除以花在本地赋值上的时间,最后得到的就是“标准时间”。
运算 示例 标准时间
本地赋值 i=n; 1。0
实例赋值 this。i=n; 1。2
int增值 i++; 1。5
byte 增值 b++; 2。0
short 增值 s++; 2。0
float 增值 f++; 2。0
double增值 d++; 2。0
空循环 while(true) n++; 2。0
三元表达式 (x》2 (或2 的任意次幂) 使用更快的硬件指令
D。3。3 特殊情况
■字串的开销:字串连接运算符+看似简单,但实际需要消耗大量系统资源。编译器可高效地连接字串,但变
量字串却要求可观的处理器时间。例如,假设 s和 t 是字串变量:
System。out。println(〃heading〃 + s + 〃trailer〃 + t);
上述语句要求新建一个 StringBuffer (字串缓冲),追加自变量,然后用toString()将结果转换回一个字
串。因此,无论磁盘空间还是处理器时间,都会受到严重消耗。若准备追加多个字串,则可考虑直接使用一
个字串缓冲——特别是能在一个循环里重复利用它的时候。通过在每次循环里禁止新建一个字串缓冲,可节
省980 单位的对象创建时间(如前所述)。利用 substring()以及其他字串方法,可进一步地改善性能。如
果可行,字符数组的速度甚至能够更快。也要注意由于同步的关系,所以 StringTokenizer 会造成较大的开
销。
■同步:在JDK 解释器中,调用同步方法通常会比调用不同步方法慢 10 倍。经 JIT 编译器处理后,这一性能
上的差距提升到50 到 100倍(注意前表总结的时间显示出要慢97 倍)。所以要尽可能避免使用同步方法—
—若不能避免,方法的同步也要比代码块的同步稍快一些。
■重复利用对象:要花很长的时间来新建一个对象(根据前表总结的时间,对象的新建时间是赋值时间的
980 倍,而新建一个小数组的时间是赋值时间的3100 倍)。因此,最明智的做法是保存和更新老对象的字
段,而不是创建一个新对象。例如,不要在自己的 paint()方法中新建一个Font 对象。相反,应将其声明成
实例对象,再初始化一次。在这以后,可在paint()里需要的时候随时进行更新。参见 Bentley 编著的《编
程拾贝》,p。81'15' 。
■异常:只有在不正常的情况下,才应放弃异常处理模块。什么才叫“不正常”呢?这通常是指程序遇到了
问题,而这一般是不愿见到的,所以性能不再成为优先考虑的目标。进行优化时,将小的“try…catch”块合
并到一起。由于这些块将代码分割成小的、各自独立的片断,所以会妨碍编译器进行优化。另一方面,若过
份热衷于删除异常处理模块,也可能造成代码健壮程度的下降。
■散列处理:首先,Java 1。0 和 1。1 的标准“散列表”(Hashtable)类需要造型以及特别消耗系统资源的
同步处理(570 单位的赋值时间)。其次,早期的 JDK 库不能自动决定最佳的表格尺寸。最后,散列函数应
针对实际使用项(Key)的特征设计。考虑到所有这些原因,我们可特别设计一个散列类,令其与特定的应用
程序配合,从而改善常规散列表的性能。注意 Java 1。2 集合库的散列映射(HashMap)具有更大的灵活性,
而且不会自动同步。
■方法内嵌:只有在方法属于final (最终)、private (专用)或static (静态)的情况下,Java 编译器
才能内嵌这个方法。而且某些情况下,还要求它绝对不可以有局部变量。若代码花大量时间调用一个不含上
述任何属性的方法,那么请考虑为其编写一个“final”版本。
■I/O:应尽可能使用缓冲。否则,最终也许就是一次仅输入/输出一个字节的恶果。注意 JDK 1。0 的I/O 类
采用了大量同步措施,所以若使用象readFully()这样的一个“大批量”调用,然后由自己解释数据,就可
获得更佳的性能。也要注意Java 1。1 的“reader”和“writer”类已针对性能进行了优化。
■造型和实例:造型会耗去2 到 200 个单?
小说推荐
- 软件工程实践者的思想(PDF格式)
- -Page 1-大 道 至 简—软件工程实践者的思想周爱民(Aimingoo 著-Page 2-序2004 年 11 月初爱民(Aimingoo)第一次把他的书稿给我,我翻看了一下,第一反应讲的是感想。这不错,在技
- 最新章:第26章
- 深入浅出MFC第2版(PDF格式)
- -Page 1-Page 2-山高月小山高月小 水落石出水落石出山高月小山高月小 水落石出水落石出-Page 3-深入淺出MFC(第版 使用Visual C 5.0 MFC 4.2)Dissecting MFC(Second Edition Using Visual C 5.0 MFC 4.2)侯俊
- 最新章:第309章
- VB2008从入门到精通(PDF格式英文版)
- -Page 1(R)The eXperT’s Voice inBeginningVB 2008From Novice to ProfessionalChristian Gross-Page 2-Page 3-Beginning VB 2008From Novice to Professional■C
- 最新章:第214章
- C语言游戏编程从入门到精通(PDF格式)
- -Page 1-Page 2-Page 3-Page 4-Page 5-Page 6-Page 7-Page 8-Page 9-Page 10-Page 11-Page 12-Page 13-Page 14
- 最新章:第4章
- JMS简明教程(PDF格式)
- -Page 1-JMS1.1规范中文版卫建军2007‐11‐22-Page 2
- 最新章:第28章
- C语言实例教程(PDF格式)
- -Page 1-前 言Visual C+是开发运行于Windows 95和Windows NT环境下的Win32应用程序的可视化编程工具中最重要的成员之一,它为软件开发人员提供了完整的编辑、编译和调试工具和建立于Win32 API(ApplicationProgramming Interface)基
- 最新章:第143章
- 神祗之眼 (正式版)第7卷(全文完)作者:百里芜虚
- 第五十一章离12月25日的圣诞节还有两天,纽约已经换上了节日的盛装,几天前的一场大雪令整个城市一片银白。人们笑逐颜开,都纷纷开始为节日做准备,商家为了在节日打开销路纷纷推出各种优惠促销手段,纽约的大街小巷全都这样热闹。依沙那被老婆打发出来买过节要用的杂货,而女儿则和凯妮一起到百货商场去买衣服去了。对
- 最新章:第23章
- SQL语言艺术(PDF格式)
- -Page 1-SQLSSQQLL语言艺术内容介绍本书分为12章,每一章包含许多原则或准则,并通过举例的方式对原则进行解释说明。这些例子大多来自于实际案例,对九种SQL经典查询场景以及其性能影响讨论,非常便于实践,为你数据库应用维护人员阅读。资深 SQL 专家 Stéphane Faroult倾力打
- 最新章:第27章
- php程序设计简明教程(DOC格式)
- -Page 1-PHP 程序设计简明教程PHP 讲义 第 1 页 共 90 页-Page 2-目录序 4第一章 PHP 简介 6
- 最新章:第31章