Java異常的性能分析_第1頁(yè)
Java異常的性能分析_第2頁(yè)
Java異常的性能分析_第3頁(yè)
Java異常的性能分析_第4頁(yè)
Java異常的性能分析_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第第頁(yè)Java異常的性能分析Java異常的性能分析

發(fā)表于:2023-03-31來(lái)源:不祥:Java譯站點(diǎn)擊數(shù):標(biāo)簽:java

Java異常的性能分析.在Java中拋異常的性能是非常差的。通常來(lái)說(shuō),拋一個(gè)異常大概會(huì)消耗100到1000個(gè)時(shí)鐘節(jié)拍。

在(Java)中拋異常的(性能)是非常差的。通常來(lái)說(shuō),拋一個(gè)異常大概會(huì)消耗100到1000個(gè)時(shí)鐘節(jié)拍。

通常是出現(xiàn)了意想不到的錯(cuò)誤,我們才會(huì)往外拋異常。也就是說(shuō),我們肯定不希望一個(gè)進(jìn)程一秒鐘就拋出上千個(gè)異常。不過(guò)有時(shí)候你確實(shí)會(huì)碰到有些方法把異常當(dāng)作事件一樣往外拋。我們?cè)谶@篇文章中已經(jīng)看到一個(gè)這樣的典范):sun.misc.BASE64Decoder之所以性能很差就是因?yàn)樗ㄟ^(guò)拋異常來(lái)對(duì)外請(qǐng)求道,'我還需要更多的數(shù)據(jù)":

at(java).lang.Throwable.fillInStackTrace(Throwable.(java):-1)

atjava.lang.Throwable.fillInStackTrace(Throwable.java:782)

-locked0x6c(asun.misc.CEStreamExhausted)

atjava.lang.Throwable.(Throwable.java:250)

atjava.lang.Exception.(Exception.java:54)

atjava.io.IOException.(IOException.java:47)

atsun.misc.CEStreamExhausted.(CEStreamExhausted.java:30)

atsun.misc.BASE64Decoder.decodeAtom(BASE64Decoder.java:117)

atsun.misc.CharacterDecoder.decodeBuffer(CharacterDecoder.java:163)

atsun.misc.CharacterDecoder.decodeBuffer(CharacterDecoder.java:194)

如果你用一個(gè)數(shù)字開(kāi)頭,字母結(jié)尾的字符串來(lái)運(yùn)行下這篇文章里面的pack方法,你也會(huì)碰到類似的情況。我們來(lái)看下用那個(gè)方法打包12345和12345a需要多長(zhǎng)的時(shí)間:

Made100.000.000iterationsforstring12345:time=12.109sec

Made1.000.000iterationsforstring12345a:time=21.764sec

可以看到,12345a迭代的次數(shù)要比12345少100倍。也就是說(shuō)這個(gè)方法處理12345a慢了差不多200倍。大多數(shù)的處理時(shí)間都在填充異常的棧跟蹤信息了:

atjava.lang.Throwable.fillInStackTrace(Throwable.java:-1)

atjava.lang.Throwable.fillInStackTrace(Throwable.java:782)

-locked0x87(ajava.lang.NumberFormatException)

atjava.lang.Throwable.(Throwable.java:265)

atjava.lang.Exception.(Exception.java:66)

atjava.lang.RuntimeException.(RuntimeException.java:62)

atjava.lang.IllegalArgumentException.(IllegalArgumentException.java:53)

atjava.lang.NumberFormatException.(NumberFormatException.java:55)

atjava.lang.NumberFormatException.forInputString(NumberFormatException.java:65)

atjava.lang.Long.parseLong(Long.java:441)

atjava.lang.Long.valueOf(Long.java:540)

atcom.mvorontsov.javaperf.StrConvTests.pack(StrConvTests.java:69)

atcom.mvorontsov.javaperf.StrConvTests.test(StrConvTests.java:38)

atcom.mvorontsov.javaperf.StrConvTests.main(StrConvTests.java:29)

通過(guò)手動(dòng)解析數(shù)字,我們可以很容易提升pack方法的性能。不過(guò)不要忘了不到萬(wàn)不得已,不要隨便優(yōu)化。如果你只是解析幾個(gè)輸入?yún)?shù)而已keepitsimple,就用JDK的方法就好了。如果你要解析大量的消息,又必須調(diào)用一個(gè)類似pack這樣的方法那確實(shí)得去優(yōu)化一下了。

新的pack方法和舊的實(shí)現(xiàn)差不太多把一個(gè)字符串轉(zhuǎn)化成一個(gè)盡可能小的Character/Integer/Long/Double/String類型,使得result.toString().equals(orginalString)為true。

publicstaticObjectstrToObject(finalStringstr)

{

if(str==null||str.length()17)

{//outofLongrange

returnstr;

}

if(str.equals())

return;//ensureinternedstringisreturned

if(str.length()==1)

returnstr.charAt(0);//returnCharacter

//ifstartswithzero-supportonly0and0.something

if(str.charAt(0)==0)

{

if(str.equals(0))

return0;

if(!str.startsWith(0.))//thismaybeadouble

returnstr;

}

longres=0;

intsign=1;

for(inti=0;istr.length();++i)

{

finalcharc=str.charAt(i);

if(c=9c=0)

res=res*10+(c-0);

elseif(c==.)

{

//toolazytowriteaproperDoubleparser,useJDKone

try

{

finalDoubleval=Double.valueOf(str);

//checkifvalueconvertedbacktostringequalstoanoriginalstring

finalStringreverted=val.toString();

returnreverted.equals(str)?val:str;

}

catch(NumberFormatExceptionex)

{

returnstr;

}

}

els

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論