• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • Java異常的性能分析

    發表于:2014-03-31來源:不祥作者:Java譯站點擊數: 標簽:java
    Java異常的性能分析.在Java中拋異常的性能是非常差的。通常來說,拋一個異常大概會消耗100到1000個時鐘節拍。

      在Java中拋異常的性能是非常差的。通常來說,拋一個異常大概會消耗100到1000個時鐘節拍。

      通常是出現了意想不到的錯誤,我們才會往外拋異常。也就是說,我們肯定不希望一個進程一秒鐘就拋出上千個異常。不過有時候你確實會碰到有些方法把異常當作事件一樣往外拋。我們在這篇文章中已經看到一個這樣的典范):sun.misc.BASE64Decoder之所以性能很差就是因為它通過拋異常來對外請求道,”我還需要更多的數據“:

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

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

      - locked <0x6c> (a sun.misc.CEStreamExhausted)

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

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

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

      at sun.misc.CEStreamExhausted.(CEStreamExhausted.java:30)

      at sun.misc.BASE64Decoder.decodeAtom(BASE64Decoder.java:117)

      at sun.misc.CharacterDecoder.decodeBuffer(CharacterDecoder.java:163)

      at sun.misc.CharacterDecoder.decodeBuffer(CharacterDecoder.java:194)

      如果你用一個數字開頭,字母結尾的字符串來運行下這篇文章里面的pack方法,你也會碰到類似的情況。我們來看下用那個方法打包"12345"和"12345a"需要多長的時間:

      Made 100.000.000 iterations for string '12345' : time = 12.109 sec

      Made 1.000.000 iterations for string '12345a' : time = 21.764 sec

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

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

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

      - locked <0x87> (a java.lang.NumberFormatException)

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

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

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

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

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

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

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

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

      at com.mvorontsov.javaperf.StrConvTests.pack(StrConvTests.java:69)

      at com.mvorontsov.javaperf.StrConvTests.test(StrConvTests.java:38)

      at com.mvorontsov.javaperf.StrConvTests.main(StrConvTests.java:29)

      通過手動解析數字,我們可以很容易提升pack方法的性能。不過不要忘了——不到萬不得已,不要隨便優化。如果你只是解析幾個輸入參數而已—— keep it simple,就用JDK的方法就好了。如果你要解析大量的消息,又必須調用一個類似pack這樣的方法——那確實得去優化一下了。

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

      public static Object strToObject( final String str )

      {

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

      { //out of Long range

      return str;

      }

      if ( str.equals( "" ) )

      return ""; //ensure interned string is returned

      if ( str.length() == 1 )

      return str.charAt( 0 ); //return Character

      //if starts with zero - support only "0" and "0.something"

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

      {

      if ( str.equals( "0" ) )

      return 0;

      if ( !str.startsWith( "0." ) ) //this may be a double

      return str;

      }

      long res = 0;

      int sign = 1;

      for ( int i = 0; i < str.length(); ++i )

      {

      final char c = str.charAt( i );

      if ( c <= '9' && c >= '0' )

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

      else if ( c == '.' )

      {

      //too lazy to write a proper Double parser, use JDK one

      try

      {

      final Double val = Double.valueOf( str );

      //check if value converted back to string equals to an original string

      final String reverted = val.toString();

      return reverted.equals( str ) ? val : str;

      }

      catch ( NumberFormatException ex )

      {

      return str;

      }

      }

      else if ( c == '-' )

      {

      if ( i == 0 )

      sign = -1; //switch sign at first position

      else

      return str; //otherwise it is not numeric

      }

      else if ( c == '+' )

    原文轉自:http://it.deepinmind.com/java/2014/03/25/java-exception-performance.html

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>