Java性能(转贴)
上一篇 / 下一篇 2007-04-03 13:28:07 / 个人分类:性能测试
2007-01-18 09:02:46 / 个人分类:性能测试
*RNm h+oR[lB&N0Java语言特别强调准确性,但可靠的行为要以性能作为代价。这一特点反映在自动收集垃圾、严格的运行期检查、完整的字节码检查以及保守的运行期同步等等方面。对一个解释型的虚拟机来说,由于目前有大量平台可供挑选,所以进一步阻碍了性能的发挥。
F1R.k3q,Ot?#ENj0"先做完它,再逐步完善。幸好需要改进的地方通常不会太多。"(Steve McConnell的《About performance》[16])
$f~e \[h(Wr0本附录的宗旨就是指导大家寻找和优化"需要完善的那一部分"。
&W"^x#r @051Testing软件测试网(Ay z R&]Cox'C/I
1 基本方法
k3NR:S7Z]0只有正确和完整地检测了程序后,再可着手解决性能方面的问题:
3QT2UhI0(1) 在现实环境中检测程序的性能。若符合要求,则目标达到。若不符合,则转到下一步。51Testing软件测试网I.Rv2XLb;b4M+O3B
(2) 寻找最致命的性能瓶颈。这也许要求一定的技巧,但所有努力都不会白费。如简单地猜测瓶颈所在,并试图进行优化,那么可能是白花时间。51Testing软件测试网Uv3vD;Hqjc\/?X
(3) 运用本附录介绍的提速技术,然后返回步骤1。51Testing软件测试网*J;CFjC6[
为使努力不至白费,瓶颈的定位是至关重要的一环。Donald Knuth[9]曾改进过一个程序,那个程序把50%的时间都花在约4%的代码量上。在仅一个工作小时里,他修改了几行代码,使程序的执行速度倍增。此时,若将时间继续投入到剩余代码的修改上,那么只会得不偿失。
%ZY(w*k]eem,u)\ M%xk0Knuth在编程界有一句名言:"过早的优化是一切麻烦的根源"(Premature optimization is the root of all evil)。最明智的做法是抑制过早优化的冲动,因为那样做可能遗漏多种有用的编程技术,造成代码更难理解和操控,并需更大的精力进行维护。
s-OM'e$h%kJ i02 寻找瓶颈
3Ok!\+_g0为找出最影响程序性能的瓶颈,可采取下述几种方法:
bT c9b+hvj0n)y-H7w"f8s8HO0
1) 安插自己的测试代码
;uZ3P LM+Oa0ju[ x(^0插入下述"显式"计时代码,对程序进行评测:
5]~/_[;Q0long start = System.currentTimeMillis();51Testing软件测试网 P_pz4gQVSaV
//要计时的运算代码放在这儿51Testing软件测试网jh0?/|ND8p!H
long time = System.currentTimeMillis() - start;51Testing软件测试网cw%k&|%r` j
利用System.out.println(),让一种不常用到的方法将累积时间打印到控制台窗口。由于一旦出错,编译器会将其忽略,所以可用一个"静态最终布尔值"(Static final boolean)打开或关闭计时,使代码能放心留在最终发行的程序里,这样任何时候都可以拿来应急。尽管还可以选用更复杂的评测手段,但若仅仅为了量度一个特定任务的执行时间,这无疑是最简便的方法。51Testing软件测试网0W1H%XKPn3cy8@:x
System.currentTimeMillis()返回的时间以千分之一秒(1毫秒)为单位。然而,有些系统的时间精度低于1毫秒(如Windows PC),所以需要重复n次,再将总时间除以n,获得准确的时间。
zz3C~G7Y&i051Testing软件测试网8`-a"c9\ p+Hm
2) JDK性能评测[2]51Testing软件测试网'L8L9R*CO8O7d)S%i
JDK配套提供了一个内建的评测程序,能跟踪花在每个例程上的时间,并将评测结果写入一个文件。不幸的是,JDK评测器并不稳定。它在JDK 1.1.1中能正常工作,但在后续版本中却非常不稳定。
"{ b)J*d]&a8O1[/y!T0为运行评测程序,请在调用Java解释器的未优化版本时加上-prof选项。例如:51Testing软件测试网&sTc"[.s?
java_g -prof myClass51Testing软件测试网)BX,?['@q4G9^
或加上一个程序片(Applet):51Testing软件测试网Q7w&`9D7D)c G9d/V
java_g -prof sun.applet.AppletViewer applet.html
3@ F3GaFb:bT0理解评测程序的输出信息并不容易。事实上,在JDK 1.0中,它居然将方法名称截短为30字符。所以可能无法区分出某些方法。然而,若您用的平台确实能支持-prof选项,那么可试试Vladimir Bulatov的"HyperPorf"[3]或者Greg White的"ProfileViewer"来解释一下结果。
*]"b3`~i:a.\(g:h7h0