可靠地计时HttpClient获取请求

时间:2014-04-05 18:19:45

标签: java android performance http get

我试图将网络速度测试从javascript移植到在Android下运行的java。加速测试工作的方法是点击CGI并请求给定数量的数据,并计算数据传输所需的时间。请求的金额会动态更改,以提供相对恒定的更新率。

但是当我尝试在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的延迟。我不确定这个额外延迟来自哪里;有没有办法摆脱它,因为这会使结果偏差超过几毫秒从缓冲区中提取数据。

1 个答案:

答案 0 :(得分:0)

可以使用调用skip()获得的InputStream getContent()函数跳过返回的内容:

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();

就呼叫开销而言,转移量越大,它占整个时间的一小部分。