메모리 카드에 저장된 파일에서 부호없는 정수를 구문 분석하려고합니다. java는 부호없는 유형을 제공하지 않기 때문에 long을 사용하여 획득 한 값을 저장합니다.안드로이드 파싱 ints 효율
성능이 디버거의 영향을받는 것 같습니다. 디버거가 연결되어 있지 않으면 ~ 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가 느린 것 또한 흥미 롭다. 만약 내가 바이트 중 하나를 반환하거나 그들의 합계가 훨씬 빠르게 작동합니다. 교대가 구현되는 방법 일 수 있습니다!?
그래, 나는 비슷한 것을 알아 차렸다. 나는 비트 맵 조작을하고 있었다. 장치에서 실행되는 동안 처리하는 데 평균 1.3 초가 걸렸으며 디버거가 연결된 상태에서 약 27 초가 걸렸습니다. – kcoppock