2012-03-19 4 views
2

파일을 다운로드하려고하는 앱이 있습니다. 다운로드에 HTTPUrlConnection을 사용하고 있습니다. 처음에는 다운로드 속도가 느려졌습니다.Android/Java 느린 네트워크 IO

버퍼링 된 입력 스트림을 사용하고 버퍼 크기를 1024에서 8192로 늘리면 성능이 향상되었습니다. 버퍼를 늘리면 성능이 향상되지 않았습니다. 여기

은 조각이다 :

에도이 후
InputStream inputStream = (InputStream) new URL(requestURL) 
        .getContent(); 
BufferedInputStream bufferedInputStream = new BufferedInputStream(
        inputStream); 
OutputStream outputStream = new FileOutputStream(fileSaveUrl); 
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
        outputStream);  

int bytesToRead = 1024 * 256; 
byte buffer[] = new byte[bytesToRead]; 
while ((count = bufferedInputStream.read(buffer)) != -1 
    && !isCancelled()) { 
     requestStatus((int) (downloaded * 100/fileSize)); 
     bufferedOutputStream.write(buffer, 0, count); 
} 

, 2 배 빠른 아이 패드에 안드로이드에 비해 동일한 파일 다운로드.

내가 누락 된 항목이 있습니까?

편집

  1. 은/언급을 요청 전에도, 다운로드는 별도의 스레드에서 실행되고 있습니다. 내가 출력을 버퍼링 할 필요가 없습니다 실현,하지만 나중에 :
  2. bytesToRead 정보] 그 주위에 얻을 것이다, 마지막 실험이 나는 서로 다른 버퍼 크기 실험이었다 2백56킬로바이트
+0

디스크에 데이터를 쓰지 못하게하면 속도가 얼마나 빨라 졌습니까? – Robert

+0

안드로이드는 Apps에 제공되는 힙 크기가 제한되어 있으며 파일이 제공된 힙 크기보다 클 수 있으므로 직접 SD 카드에 씁니다. 또한 몇 가지 테스트를 실행했는데 파일 섹션에 쓰는 것이 전체 프로그램의 속도를 늦추지는 않습니다. –

+1

"필자는 몇 가지 테스트를했지만, 파일 섹션에 쓰는 것이 전체 프로그램의 속도를 늦추지는 않습니다."- 그래야합니다. 일반적으로 멀티 스레드 프로그래밍에서는 최대 성능을 목표로한다면 다른 스레드에서 쓰는 것이 좋습니다. – CommonsWare

답변

2

동일한 스레드에서 SD 카드에 다운로드하고 쓰는 것이 문제였습니다. 성능을 향상시키기 위해 차단 대기열 버퍼를 사용하여 작업을 두 개의 스레드로 분할하십시오.

2
requestStatus((int) (downloaded * 100/fileSize)); 

이것은 하나의 병목 일 수 있습니다. 일반적으로 작업을 수행하는 동일한 스레드에서 상태를 업데이트하는 것은 좋은 생각이 아닙니다. 스레드는

variable = (int) (downloaded * 100/fileSize); 

그런 다음 당신의 UI 스레드가 진행률을 표시하기 위해 그 변수를 폴링한다 ... 휘발성 변수를 갱신해야합니다.

또한 가장 저렴한 SD 카드는 속도가 느리고 카드에 쓰면 대용량 파일의 속도가 느려질 수 있습니다.

+0

이것은 병목이 아니라 매우 유효한 점입니다 :) –