欢迎来到天天文库
浏览记录
ID:8972045
大小:46.86 KB
页数:3页
时间:2018-04-13
《java性能优化字符串过滤》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Java性能优化:字符串过滤首先描述一下需求,具体如下:给定一个String对象,过滤掉除数字(字符'0'-'9')以外的其它字符。要求时间开销尽可能小。过滤函数的原型如下:Stringfilter(Stringstr);针对上述需求,我们用了4个不同的过滤函数。为了叙述方便,分别称为filter1到filter4。其中filter1性能最差、filter4性能最好。好了不多说我们先来看一下代码:★代码实现◇测试代码为了方便测试性能,先准备好一个测试代码,具体如下:测试字符串为“D186783E36B
2、721651E8AF96AB1C4000B”。◇版本1先来揭晓性能最差的filter1,代码如下:为了和后续对比,先记下filter1的处理时间,大约在4.8-4.9秒之间。◇版本2再来看看filter2,代码如下:filter2的处理时间大约为1.7-1.8秒,提升了大约3倍。◇版本3然后看看filter3,代码如下:Filter3和filter2差别也很小,唯一差别就在于调用了StringBuffer带参数的构造函数。通过StringBuffer的构造函数设置初始的容量大小,可以有效避免appen
3、d()追加字符时重新分配内存,从而提高性能。Filter3的处理时间大约在1.6-1.7秒。约提高6%◇版本4最后来看看终极版本,性能最好的filter4。你可能会想:filter4和前几个版本的差别也挺大了吧!filter4既没有用String也没有用StringBuffer,而是拿字符数组进行中间处理。Filter4的处理时间,只用了0.2-0.3秒,相对于filter3提升了将近8倍。是不是因为直接操作字符数组,节省了append(char)的调用?通过查看append(char)的源代码,内部
4、的实现很简单,应该不至于提升这么多。那是什么原因捏?虽然filter4有一个字符数组的创建开销,但是相对于filter3来说,StringBuffer的构造函数内部也会有字符数组的创建开销。两相抵消。所以filter4比filter3还多节省了StringBuffer对象本省的创建开销。所以节约了性能。★对4个方法的总结上述4个方法,filter1和filter4的性能相差19倍。几个版本都是通过节省内存分配,降低了时间开销★一点补充说明,关于时间和空间的平衡另外,需要补充说明一下。Filter3和f
5、ilter4使用了空间换时间的手法来提升性能。假如被过滤的字符串很大,并且数字字符的比例很低,这种方式就不太合算了。举个例子:被处理的字符串中,绝大部分都只含有不到10%的数字字符,只有少数字符串包含较多的数字字符。对于filter3来说,可以把newStringBuffer(nLen);修改为newStringBuffer(nLen/10);来节约空间开销。但是filter4就没法这么玩。所以,具体该用filter3还是filter4,要看具体情况了。只有在你非常看重时间开销,且数字字符比例很高(至
6、少大于50%)的情况下,用filter4才合算。否则的话,建议用filter3。以上的数据在我自己的机子上测试是这样的(我是用Java环境是JDK1.6.0)。
此文档下载收益归作者所有