2010-12-29 8 views
2

メモリカードに保存されているファイルから符号なし整数を解析しようとしています。 javaは符号なしの型を提供しないので、私はlongを使って得られた値を格納します。Android parsing ints efficiency

パフォーマンスはデバッガの影響を受けているようです: デバッガが接続されていないと、〜820msの20000の値を解析できます。 デバッガ〜5800ms(HTC Desire上)。

端末でこれを再生できますか?なぜデバッガにこのようなオーバーヘッドがあるのか​​?ここで

はコードです:

public class IntParsingTest extends Activity { 

public static final String TEST_FILE = "yourfile"; 
public static final int LOOPS = 20000; 

private Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     super.handleMessage(msg); 
     Toast.makeText(IntParsingTest.this, (CharSequence) msg.obj, Toast.LENGTH_LONG).show(); 
    } 
}; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    try { 

     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       Message m = new Message(); 
       File path = Environment.getExternalStorageDirectory(); 
       File f = new File(path, TEST_FILE); 
       long startTime = SystemClock.currentThreadTimeMillis(); 
       try { 
        InputStream is = new FileInputStream(f); 
        for (int i = 0; i < LOOPS; i++) { 
         readUnsignedInt(is); 
        } 
        long total = SystemClock.currentThreadTimeMillis() - startTime; 
        m.obj = "Time to parse\r\n" 
         + LOOPS 
         + " unsigned integers:\r\n" 
         + total + " ms"; 
        handler.sendMessage(m); 
       } catch (Exception e) { 
        m.obj = e.getMessage(); 
        handler.sendMessage(m); 
       } 


      } 
     }; 
     new Thread(r).start(); 
    } catch (Exception e) { 

    } 
} 

public static long readUnsignedInt(InputStream input) throws IOException { 
    long b1 = input.read(); 
    long b2 = input.read(); 
    long b3 = input.read(); 
    long b4 = input.read(); 
    return (b1 << 24) + (b2 << 16) + (b3 << 8) + b4; 
} 

}

編集:それだけシフトopperationsが遅いということも興味深いものです。バイトまたはそれらの合計のいずれかを返すと、はるかに高速に動作します。シフトが実装される方法かもしれません!

+0

ええ、私は似たようなことに気付きました。私はビットマップ操作をしていました。デバッガを接続して約27秒かかりました。 – kcoppock

答えて

0

私はここで推測しています - デバッガを接続してJVMはジャストインタイムコンパイルを実行できません。ブレークポイントを検出できるようにするためには、バイトコードの解釈を常に行う必要があります。デバッガはデバイスログストリームにも接続します。これにより、オーバーヘッドが発生する可能性があります。