系统性能调优(5)----Java循环与字符串代码优化
在系統(tǒng)性能優(yōu)化的時(shí)候循環(huán)和字符串處理一直是非常值得注意的地方。從心態(tài)上我們一定不能把自己的眼界放在十次或者是百次循環(huán)的層次上,也不能把自己要處理的字符串當(dāng)做是有十個(gè)二十個(gè)字符。每次遇到循環(huán)都要假定這個(gè)循環(huán)是上萬(wàn)次的,每次要處理的字符串的時(shí)候一定要告訴自己這個(gè)字符串將來(lái)有可能是很大的。不要等到數(shù)據(jù)量真的達(dá)到十萬(wàn)、百萬(wàn)的級(jí)別之后再采取處理,那樣的話(huà)成本的消耗就太大了。本文將介紹關(guān)于Java代碼中循環(huán)和字符串的優(yōu)化方法,希望對(duì)讀者有用。
關(guān)于循環(huán)
嵌套for循環(huán)中次數(shù)多的放在內(nèi)側(cè),次數(shù)少的放在外側(cè)。眾所周知for循環(huán)需要定義一個(gè)循環(huán)變量來(lái)遍歷每一個(gè)需要循環(huán)的對(duì)象,那么如果循環(huán)次數(shù)多的循環(huán)放在外側(cè)那么無(wú)疑將會(huì)使得總體的變量增多,效率自然會(huì)降低。下面進(jìn)行代碼測(cè)試
?
public class Test{public static void main (String [] args){Long time2Before=System.nanoTime();for (int i=0; i<10;i++ ){ for (int j=0; j<1000000;j++ ){ }}Long time2After=System.nanoTime();System.out.println("faster--->"+(time2After-time2Before));Long time1Before=System.nanoTime();for (int i=0; i<1000000;i++ ){ for (int j=0; j<10;j++ ){ }}Long time1After=System.nanoTime();System.out.println("slower--->"+(time1After-time1Before));} }?
在循環(huán)中只做與循環(huán)相關(guān)的事情,一些不必要的循環(huán)不要放到循環(huán)當(dāng)中去做。比如在遍歷集合的時(shí)候沒(méi)有必要將取得集合大小放在循環(huán)中去做,完全可以放在集合的外邊。效果上沒(méi)區(qū)別,性能上差距巨大。
?
import java.util.*; public class Test1{public static void main (String [] args){List<String> list=new ArrayList<String>();for(int i=0;i<1000000;i++){list.add("luck"+i);}Long time1Before=System.nanoTime();for(int i=0;i<list.size();i++){// System.out.println(list.get(i));}Long time1After=System.nanoTime();System.out.println("use .size-->"+(time1After-time1Before));Long time2Before=System.nanoTime();int n=list.size();for(int i=0;i<n;i++){// System.out.println(list.get(i));}Long time2After=System.nanoTime();System.out.println("do not use .size-->"+(time2After-time2Before));} }?
關(guān)于字符串
消除字符串連接,在程序中優(yōu)先考慮使用StringBuffer或者StringBuilder代替String。一個(gè)字符串相當(dāng)于一個(gè)匿名的String對(duì)象,如果在程序中拼接兩個(gè)字符串那么會(huì)在內(nèi)存中定義三個(gè)字符串空間。而StringBuffer或者StringBuilder就不會(huì)這么做,而是在原來(lái)已有的StringBuffer或者StringBuilder對(duì)象中進(jìn)行修改。測(cè)試代碼如下
?
public class Test3{public static void main (String [] args){long time1Before=System.nanoTime();String str="";for(int i=0;i<10000;i++){str+=i;}long time1After=System.nanoTime();System.out.println("use String ---> "+(time1After-time1Before));long time2Before=System.nanoTime();StringBuilder sbuilder=new StringBuilder();for(int i=0;i<10000;i++){sbuilder.append(i);}long time2After=System.nanoTime();System.out.println("use StringBuilder---> "+(time2After-time2Before));long time3Before=System.nanoTime();StringBuffer stringBuffer=new StringBuffer();for(int i=0;i<10000;i++){stringBuffer.append(i);}long time3After=System.nanoTime();System.out.println("use StringBuffer---> "+(time3After-time3Before));} }?
需要說(shuō)明的是在StringBuffer和StringBuilder之間如果需要考慮選其一的話(huà)原則很簡(jiǎn)單,前者是線程安全的后者是線程不安全的,換句話(huà)說(shuō)后者比前者更快。綜上所述如果單單從性能上考慮的話(huà)從高到低依次是:StringBuilder --> StringBuffer --> String。
?
循環(huán)和字符串是程序中最容易提升代碼效率的地方,因?yàn)楹芏嗳嗽趯?xiě)程序的時(shí)候?yàn)榱藞D一時(shí)方便將效率拋在腦后,當(dāng)要處理的數(shù)據(jù)不大的時(shí)候無(wú)所謂,一旦程序要處理的數(shù)據(jù)增大那么性能的瓶頸也就出現(xiàn)了。所以就像文章開(kāi)頭所說(shuō)的,要在寫(xiě)程序的時(shí)候就要考慮十萬(wàn)百萬(wàn)的數(shù)量級(jí),不要等到性能瓶頸出現(xiàn)再去解決,因?yàn)榇a重構(gòu)或者說(shuō)后期的優(yōu)化成本要遠(yuǎn)遠(yuǎn)高于前期的開(kāi)發(fā)成本,相信看過(guò)別人無(wú)注釋而又冗長(zhǎng)代碼的童鞋深有體會(huì)(竊笑~~)。
?
總結(jié)
以上是生活随笔為你收集整理的系统性能调优(5)----Java循环与字符串代码优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 谈谈你对云计算技术的看法
- 下一篇: Debian 7.1.0 安装教程图解(