- 写在前面的话
- 引言
- 第 1 章 对象入门
- 第 2 章 一切都是对象
- 第 3 章 控制程序流程
- 第 4 章 初始化和清除
- 第 5 章 隐藏实施过程
- 第 6 章 类再生
- 第 7 章 多形性
- 第 8 章 对象的容纳
- 第 9 章 违例差错控制
- 第 10 章 Java IO 系统
- 第 11 章 运行期类型鉴定
- 第 12 章 传递和返回对象
- 第 十三 章 创建窗口和程序片
- 第 14 章 多线程
- 第 15 章 网络编程
- 第 16 章 设计范式
- 第 17 章 项目
- 附录 A 使用非 JAVA 代码
- 附录 B 对比 C++和 Java
- 附录 C Java 编程规则
- 附录 D 性能
- 附录 E 关于垃圾收集的一些话
- 附录 F 推荐读物
D.2 寻找瓶颈
为找出最影响程序性能的瓶颈,可采取下述几种方法:
D.2.1 安插自己的测试代码
插入下述“显式”计时代码,对程序进行评测:
long start = System.currentTimeMillis();
// 要计时的运算代码放在这儿
long time = System.currentTimeMillis() - start;
利用 System.out.println(),让一种不常用到的方法将累积时间打印到控制台窗口。由于一旦出错,编译器会将其忽略,所以可用一个“静态最终布尔值”(Static final boolean)打开或关闭计时,使代码能放心留在最终发行的程序里,这样任何时候都可以拿来应急。尽管还可以选用更复杂的评测手段,但若仅仅为了量度一个特定任务的执行时间,这无疑是最简便的方法。
System.currentTimeMillis() 返回的时间以千分之一秒(1 毫秒)为单位。然而,有些系统的时间精度低于 1 毫秒(如 Windows PC),所以需要重复 n 次,再将总时间除以 n,获得准确的时间。
D.2.2 JDK 性能评测 [2]
JDK 配套提供了一个内建的评测程序,能跟踪花在每个例程上的时间,并将评测结果写入一个文件。不幸的是,JDK 评测器并不稳定。它在 JDK 1.1.1 中能正常工作,但在后续版本中却非常不稳定。
为运行评测程序,请在调用 Java 解释器的未优化版本时加上-prof 选项。例如:
java_g -prof myClass
或加上一个程序片(Applet):
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://www.cs.cmu.edu/~jch/java/tools.html
D.2.4 性能评测的技巧
■由于评测时要用到系统时钟,所以当时不要运行其他任何进程或应用程序,以免影响测试结果。
■如对自己的程序进行了修改,并试图(至少在开发平台上)改善它的性能,那么在修改前后应分别测试一下代码的执行时间。
■尽量在完全一致的环境中进行每一次时间测试。
■如果可能,应设计一个不依赖任何用户输入的测试,避免用户的不同反应导致结果出现误差。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论