我在调用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秒以上的平均值。
答案 0 :(得分:0)
试
HttpConnectionParams.setTcpNoDelay(httpClient.getParams(), true);
运行免费的wireshark / sharkwire并告诉我们您的所见。
这将告诉您花费的时间。
答案 1 :(得分:0)
我在一段时间后修复了这个问题,但是我会发布被发现的问题/解决方案,因为其他人可能会在这里发现。
最初我假设一个请求进入HttpClient.execute(...)
后会立即执行。在我的情况下,情况并非如此,因为我使用的是连接池,它在同一路径上重新使用连接。此外,客户端配置为每个路由使用2个连接。事实证明,我的一个代码块未能解析API响应,并且无法确保连接将被关闭。随着应用程序的继续,多个数据流被打开并阻止其他待处理的连接。这种有限的吞吐量导致了我遇到的错误行为。
使用类似EntityUtils.toString(entity)
的内容成为消费内容的更好方式,并保证在完成后关闭连接。