2

我正在对调用后的较长响应时间进行故障排除,HttpClient.execute(...)并且我想确保我已在客户端上完成所有操作以优化 HTTP 请求的性能。

对网络的请求需要 1 到 40 秒,但平均约为 4 秒。我认为网络连接不是瓶颈,因为我使用的是强大的 WiFi 连接并且那里的速度没有问题。

HttpClient 的设置如下:

public static final int MAX_TOTAL_CONNECTION = 20;
public static final int MAX_CONNECTIONS_PER_ROUTE = 20;
public static final int TIMEOUT_CONNECT = 15000;
public static final int TIMEOUT_READ = 15000;

SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));

HttpParams connManagerParams = new BasicHttpParams();
ConnManagerParams.setMaxTotalConnections(connManagerParams, MAX_TOTAL_CONNECTIONS);
ConnManagerParams.setMaxConnectionsPerRoute(connManagerParams, new ConnPerRouteBean(MAX_CONNECTIONS_PER_ROUTE));

HttpConnectionParams.setConnectionTimeout(connManagerParams, TIMEOUT_CONNECT);
HttpConnectionParams.setSoTimeout(connManagerParams, TIMEOUT_READ);

ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(new BasicHttpParams(), schemeRegistry);
sHttpClient = new DefaultHttpClient(cm, connManagerParams);

现在是主观问题:有没有更优化的方法来设置它?

我正在HttpClient.execute(...)使用时间捕获来包装调用,因此调用下面的所有内容都是execute(...)平均花费 4 秒以上的地方。

4

2 回答 2

0

尝试

HttpConnectionParams.setTcpNoDelay(httpClient.getParams(), true);

运行免费的 wireshark/sharkwire 并告诉我们你看到了什么。

http://www.wireshark.org/

这将告诉您时间都花在了哪里。

于 2012-07-23T23:48:58.863 回答
0

我不久前解决了这个问题,但我会将发现的问题/解决方案发布为其他人可能会在这里找到的方法。

最初我假设一个请求一旦进入HttpClient.execute(...). 在我的情况下这不是真的,因为我使用的是连接池,它在同一条路由上重复使用连接。此外,客户端被配置为每条路由使用 2 个连接。事实证明,我的代码块之一未能解析 API 响应,并且无法确保连接会关闭。随着应用程序的继续运行,多个数据流处于打开状态并阻止了其他挂起的连接。这种有限的吞吐量导致了我遇到的错误行为。

使用类似的东西EntityUtils.toString(entity)成为一种更好的方式来消费内容并保证连接完成后关闭。

于 2014-02-04T08:24:09.407 回答