我试图将网络速度测试从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的延迟。我不确定这个额外延迟来自哪里;有没有办法摆脱它,因为这会使结果偏差超过几毫秒从缓冲区中提取数据。
答案 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();
就呼叫开销而言,转移量越大,它占整个时间的一小部分。