【发布时间】:2011-01-11 05:21:39
【问题描述】:
我正在开发 Android 应用程序,该应用程序使用大量对 Web 服务的 http 请求。起初,我在每个请求之前创建一个新的 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
会发生什么,我该如何应对?
更新
使用保活优势 - 是我想要的。但是当我为每个请求创建新的 HttpClient 实例时,连接不能被重用。尽管如此,这样的版本运行速度更快,我不清楚它的原因。
【问题讨论】:
-
我只能说带同步的并行比不带同步的串行慢。这就是为什么并行端口死了而串行 USB 端口胜出的原因。
-
是否所有请求都指向同一个 Web 服务/主机?可能是服务器不喜欢它,或者您可能因为在 100 个线程上执行 10 个工作单元而失去了 HTTP 的“keepalive”优势。请求量大吗?带宽可能是一个瓶颈。
-
是的,请求是针对同一个网络服务的。线程数少于请求数,实际上我用 2 或 3 个线程测试它。请求很小,只有几个 xml 标签。
标签: android performance httpclient