2010-12-29 2 views
2

메모리 카드에 저장된 파일에서 부호없는 정수를 구문 분석하려고합니다. 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가 느린 것 또한 흥미 롭다. 만약 내가 바이트 중 하나를 반환하거나 그들의 합계가 훨씬 빠르게 작동합니다. 교대가 구현되는 방법 일 수 있습니다!?

+0

그래, 나는 비슷한 것을 알아 차렸다. 나는 비트 맵 조작을하고 있었다. 장치에서 실행되는 동안 처리하는 데 평균 1.3 초가 걸렸으며 디버거가 연결된 상태에서 약 27 초가 걸렸습니다. – kcoppock

답변

0

여기 디버거가 연결된 JVM이 JIT (just-in-time) 컴파일을 할 수 없다고 생각합니다. 중단 점을 감지 할 수 있으려면 항상 바이트 코드 해석을 수행해야합니다. 또한 디버거는 장치 로그 스트림에 연결되기 때문에 약간의 오버 헤드가 발생할 수 있습니다.