Android HttpClient性能

Ily*_*kin 9 performance android httpclient

我正在开发使用大量http请求到web服务的android应用程序.起初,我在每个请求之前创建一个新的HttpClient实例.为了提高性能,我尝试在许多线程中执行请求.所以,我使用ThreadSafeConnectionManager创建了由所有线程共享的单个HttpClient实例:

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

BasicHttpParams params = new BasicHttpParams();
ConnManagerParams.setMaxTotalConnections(params, 100);
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setUseExpectContinue(params, true);

ThreadSafeClientConnManager connManager = new ThreadSafeClientConnManager(params, registry);
HttpClient client = new DefaultHttpClient(connManager, params);
Run Code Online (Sandbox Code Playgroud)

但令我惊讶的是,性能下降了.我已经测量了时间,以这种方式执行请求:

long startTime = System.currentTimeMillis();
HttpResponse response = client.execute(postRequest);
long reqTime = System.currentTimeMillis() - startTime;
Log.i("SyncTimer", "Request time:" + reqTime);
Run Code Online (Sandbox Code Playgroud)

这是一个日志,我用简单的DefaultHttpClient获取,没有参数每个请求的新实例:

01-11 11:10:51.136: INFO/SyncTimer(18400): Request time:1076
01-11 11:10:54.686: INFO/SyncTimer(18400): Request time:1051
01-11 11:10:57.996: INFO/SyncTimer(18400): Request time:1054
01-11 11:10:59.166: INFO/SyncTimer(18400): Request time:1070
01-11 11:11:00.346: INFO/SyncTimer(18400): Request time:1172
01-11 11:11:02.656: INFO/SyncTimer(18400): Request time:1043
Run Code Online (Sandbox Code Playgroud)

我使用ThreadSafeClientConnManager和单个HttpClient实例获得了什么:

01-11 11:06:06.926: INFO/SyncTimer(18267): Request time:7001
01-11 11:06:10.412: INFO/SyncTimer(18267): Request time:3385
01-11 11:06:20.222: INFO/SyncTimer(18267): Request time:9801
01-11 11:06:23.622: INFO/SyncTimer(18267): Request time:2058
01-11 11:06:29.906: INFO/SyncTimer(18267): Request time:6268
01-11 11:06:34.746: INFO/SyncTimer(18267): Request time:3525
01-11 11:06:50.302: INFO/SyncTimer(18267): Request time:15551
Run Code Online (Sandbox Code Playgroud)

会发生什么,我该怎么办呢?

UPDATE

使用保持活力的优势 - 是我想要的.但是当我为每个请求连接创建新的HttpClient实例时,无法重用.尽管如此,这样的版本运行速度更快,我的原因尚不清楚.

ok2*_*k2c 15

这一切都很简单.默认情况下,HttpClient仅允许两个并发连接到HTTP规范所需的同一目标主机.因此,有效地,您的工作线程会将大部分执行时间用于阻止等待这两个连接变为可用.

您应该增加"每个路由的最大连接数"限制,以减少/消除工作线程争用.

您可能还想查看Apache HttpComponents项目使用的基准来衡量HttpClient的性能.

http://wiki.apache.org/HttpComponents/HttpClient3vsHttpClient4vsHttpCore