メモリカードに保存されているファイルから符号なし整数を解析しようとしています。 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が遅いということも興味深いものです。バイトまたはそれらの合計のいずれかを返すと、はるかに高速に動作します。シフトが実装される方法かもしれません!
ええ、私は似たようなことに気付きました。私はビットマップ操作をしていました。デバッガを接続して約27秒かかりました。 – kcoppock