Android HttpClient 性能

标签 android performance httpclient

我开发的 Android 应用程序使用大量的 HTTP 请求来访问 Web 服务。起初,我在每次请求之前创建一个新的 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);

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

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

会发生什么,我该如何应对?

更新

利用 keep-alive 优势——这就是我想要的。但是当我为每个请求连接创建新的 HttpClient 实例时,无法重用。尽管如此,这样的版本运行速度更快,我不清楚原因。

最佳答案

一切都很简单。默认情况下,HttpClient 仅允许两个并发连接到 HTTP 规范要求的同一目标主机。因此,实际上,您的工作线程将大部分执行时间都花在了等待这两个连接可用的阻塞上。

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

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

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

关于Android HttpClient 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4654480/

相关文章:

android - 从 android 连接到 REST web 服务抛出 javax.net.ssl.SSLException : Not trusted server certificate

android - 从 Firebase 获取特定用户的分数和类别

sql - 如何以每条记录都与 "previous"记录连接的方式自连接表?

mysql - 即使有大量可用连接,响应也非常慢

HttpClient - 查询字符串的限制?

java - 用于删除用户/参与者的 JIRA Rest API DELETE 调用不会删除用户

java - 无法从 SQLite 检索数据

c++ - LSH 比 BruteForce 匹配慢

java - Android HTTPS 客户端不从套接字读取数据

Android:在哪里以及如何自动刷新 ListView (我有刷新功能)