转自:http://blog.csdn.net/sinboy/article/details/1536625
程序在实际应用当中,大数据量时对系统本身的影响是一个不得不面对的问题。
最早在使用Jbuilder时,它有个相配套的工具叫Optimize Suite,可以在JBuilder中使用,也可独立使用,用它可以监测运行的并发线程数据、内存的使用情况等,也是不款非常不错的性能测试套件。可惜随着JBuilder的衰落它也渐渐消失在人们的视线中了。我记得还有一个独立的性能测试工具叫JProfiler,从名字上就能看出它是用来干么的,当时好象也是倍受好评的一款工具。
Eclipse崛起后,插件迅速流行,我也非常喜欢这种“按需分配”的模式,用到什么就添加什么。以前对性能这方面的意识不是很强,但上次出现一次教训后,慢慢变的重视起来。人总是在经历过一些教训之后才会长成色:)
首先想到是从Eclipse官方网站找,果然没有让我失望。ECLIPSE官方有一个Test & Performance Tools Platform (TPTP)的项目,很早就有了,只是以前没有关注过,现在最新的稳定版本已经是4.3.1了。可以进行程序执行时间的统计分析、内存的监控、对象调用的分析等,我现在都关注的是的功能是Execution Statistics(程序执行统计),可以显示程序当中开销最大的10个方法也就是系统的瓶颈。找到了瓶颈,我们就可以想方设法去解决它了,或优化或重写,对症下药,不用再无的放失。
其实TPTP的使用很简单,但在下载使用的时候一定要注意TPTP插件本身的版本和ECLIPSE版本的配合,否则很可能会重蹈我连试好几次都无法正常运行的覆辙。下面简单说一下安装和使用的步骤:
1.从ECLIPSE官方网站下载TPTP4.3.1版本,和它相应的ECLIPSE版本是3.2.2,如图一所示:
图一
2.安装完成后,重新启动ECLIPSE,必要的话请加上参数-clean进行清理。如果安装正常,在标准按钮一栏会显示TPTP的快捷图标,如图二所示:
图二
3.选择你要进行性能测试的工程的主类,在该主类上用右键点击,菜单上会出现Profile as,再选择java application。当然,如果你的工程不是JAVA应用程序,而是web程序,你还需要安装相应的web插件WTP,选择Profile on serve即可,如下图三所示:
图三
4.之后,会显示一个选择监控项目的窗口,它默认的监测项目有三个:内存分析(Basic Memory Analysis)、执行时间分析(Executeion Time Analysis)、代码覆盖(Method Code Coverage),如下图四所示:
图四
5.点击确定按钮,程序开始运行,同时监控也将开始,ECLIPSE会切换的监控视图,如下图五所示:
图五
6.双击监项目,可以看到具体的监控结果,如下图六所示:
图六
7.从上面监控结果来看,很清楚地知道了系统中开销最大的现个方法,奇怪的是这个几在平时看来并不特别的方法怎么会有如此大的开销呢?仔细分析代码发现,每次用数据过来之后,在处理之前和处理完毕后都要判断发送者是移动号码还是联通号码,在判断号码时又调用了字符串全角转半角的方法quan2ban(String str)。噢,原来如此呀。虽然在全转半时考虑到了全角数字的情况,但实际系统的运行过程,这一可能性几乎不会出现,所以可以把quan2ban()方法从中移除,开销大大减少。isAllChinese()方法也是如此,代码调整后再次测试,结果如下图七所示:
图七
8.虽然有了大大的改进,但这两个方法好象还被多次调用,问题何在?对方法的调用情况做进一步的分析得知,在程序初始化词典库时,会用过该两方法,但初始化并不影响系统的正常数据处理,可以先把初始化的过程屏蔽掉,再次测试,结果如下图八所示:
图八
9.很奇怪,开销最大的竟然是四个类的构造函数,真的是一头雾水,构造函数里并没有执行什么操作,怎么可能会有如此大的开销呢?况且我刚刚对对象的创建做过测试,几乎是不花费多少开销的。经过仔细研究发现,日志的输出我用到了LOG4J这个实用的工具,并且为了使日志输出能够按照我自定义的方式进行,每个类在创建时我都调用了一这样一句:PropertyConfigurator.configure(ConfParam.LOG4J_PROP_CONF);难道是加载配置参数的原因?把这一句屏蔽掉,问题果然消除。一一对开销比较大的方法进行分析优化,使系统的处理能力有了很大的改观。
在TPTP的学习使用当中,我主要用到了执行时间分析这一项监控功能,因为我系统的主要问题出现在执行的效率上,如果是内存开销的问题,你可以把注意力集中到内存分析上。当然TPTP还有其它很强大的功能,有待进一步的学习和研究。
提示:使用TPTP进行性能测试时,系统启动的时间和运行的时间都可能远远超出正常运行的时间,我原来正常1分钟完成初始化的过程,启用TPTP后竟然长达10几分钟,晕。。。