2014-04-05 3 views
0

Android에서 실행되는 자바 스크립트에서 네트워크 속도 테스트를 이식하려고합니다. 테스트 작업 속도를 높이는 방법은 CGI를 사용하고 주어진 양의 데이터를 요청하고 데이터가 전송되는 데 걸리는 시간을 측정하는 것입니다. 이 금액은 비교적 일정한 업데이트 속도를 제공하기 위해 동적으로 변경됩니다.신뢰할 수있는 타이밍 HttpClient 요청 받기

하지만 Android에서이 작업을 수행하려고하면 요청한 데이터 양에 비례하지 않는 것으로 보입니다. 나는 이런 식으로 뭔가를하고있는 중이 야이에서

final HttpParams params = new BasicHttpParams(); 
    HttpClient httpclient = new DefaultHttpClient(ccm,params); 
    URI url; 
    try { 
     url = new URI("https://myserver.com/randomfile.php?pages=250"); 
    } catch (Exception e) { 
     return -1; 
    } 
    HttpParams p = httpclient.getParams(); 
    int timeout = 5000; 
    p.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, timeout); 
    p.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout); 
    HttpGet request = new HttpGet(); 
    request.setURI(url); 

    try { 
     long t0,t1,dt; 
     int rc; 
     t0 = java.lang.System.currentTimeMillis(); 
     HttpResponse response = httpclient.execute(request); 
     t1 = java.lang.System.currentTimeMillis(); 
     dt=t1-t0; 
     rc=response.getStatusLine().getStatusCode(); 
     Log.d(logtag,"Get response code="+rc+",t="+dt); 
    } catch (Exception e) { 
     return -1; 
    } 

, 나는 어쩌면이 헤더의 반응을보고으로 httpclient.execute에 대한 호출은 즉시 반환하지만, 모든 데이터가 전송되기 전에 같은데요. 데이터가 완전히 수신 된 시점을 알기 위해 필요한 최소한의 작업량을 찾고 있습니다. 데이터가 무엇인지 신경 쓰지 않아요. 그냥 던져 버리면 행복 해요. 그냥 임의의 바이트입니다.보고 된 전송 속도가 왜곡되지 않도록 가능한 한 처리하는 데 추가 시간을 낭비하고 싶지 않습니다.

이 작업을 수행하기 위해 필요한 최소값은 무엇입니까?

또한 전화를 설정하는 데 약간의 추가 오버 헤드가있는 것처럼 보입니다. 예를 들어, 4096 바이트의 1MB를 읽으려는 경우 약 500ms 지연이 어느 정도 발생합니다. 이 여분의 지연이 어디에서 오는지는 확실하지 않습니다. 그것을 없애는 방법이 몇 가지 있습니다. 버퍼에서 데이터를 꺼내는 데 몇 밀리 초가 넘는 결과가 왜곡 될 것이기 때문입니다.

답변

0

단순히 호출 getContent() 의해 얻어진 InputStreamskip() 함수를 사용하여 리턴 된 콘텐츠 위에 이동시킬 수있다 : 그것은 작은 부분보다 큰 전송으로, 지금까지의 통화 오버 헤드

InputStream instr; 
t0 = java.lang.System.currentTimeMillis(); 
HttpResponse response = httpclient.execute(request); 
rc=response.getStatusLine().getStatusCode(); 
instr=response.getEntity().getContent(); 
instr.skip(250*4096); 
t1 = java.lang.System.currentTimeMillis(); 

을 전체 시간 중.