微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android HttpClient的性能

我开发的 Android应用程序使用大量的http请求到Web服务.首先,我在每个请求之前创建一个新的HttpClient实例.
为了提高性能,我尝试在许多线程中执行请求.所以,我创建了一个HttpClient实例,由所有线程共享,使用ThreadSafeConnectionManager:
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);

但表现却下降了,让我感到惊讶.我已经测量了时间,以这样的方式排出要求:

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

这里是一个日志,我可以用简单的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

和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

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

UPDATE

使用保持活力的优势 – 是我想要的.但是当我为每个请求连接创建新的HttpClient实例不能重复使用.尽管如此,这样的版本运行速度更快,但是对于我来说这是不清楚的.

解决方法

这一切都很简单.认情况下,HttpClient只允许与HTTP规范要求的同一目标主机的两个并发连接.因此,您的工作线程有效地消耗大部分执行时间,等待这两个连接可用.

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐