Tôi đang phát triển ứng dụng android sử dụng rất nhiều yêu cầu http cho dịch vụ web. Lúc đầu, tôi đã tạo một cá thể HttpClient mới trước mỗi yêu cầu. Để tăng hiệu suất, tôi cố gắng thực hiện các yêu cầu trong nhiều chủ đề. Vì vậy, tôi đã tạo một cá thể HttpClient duy nhất, được chia sẻ bởi tất cả các chủ đề, sử dụng ThreadSafeConnectionManager:Hiệu suất của Android 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);
Nhưng hiệu suất giảm, làm tôi ngạc nhiên. Tôi đã đo thời gian, để được spended để exequte yêu cầu theo cách như vậy:
long startTime = System.currentTimeMillis();
HttpResponse response = client.execute(postRequest);
long reqTime = System.currentTimeMillis() - startTime;
Log.i("SyncTimer", "Request time:" + reqTime);
Dưới đây đây là một khúc gỗ, mà tôi nhận được với DefaultHttpClient đơn giản không có tham số ví dụ mới theo yêu cầu:
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
Và những gì Tôi nhận được với ThreadSafeClientConnManager và cá thể HttpClient đơn lẻ:
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
Điều gì sẽ xảy ra và làm cách nào để chống lại điều này?
CẬP NHẬT
Sử dụng giữ-sống lợi thế - là những gì tôi muốn. Nhưng khi tôi tạo mới HttpClient dụ cho mỗi kết nối yêu cầu không thể được tái sử dụng. Mặc dù vậy, phiên bản như vậy chạy nhanh hơn, lý do không rõ ràng cho tôi.
Tất cả những gì tôi có thể nói là song song với đồng bộ hóa chậm hơn Serial mà không đồng bộ hóa. Do đó tại sao cổng song song đã chết và cổng USB nối tiếp giành được. –
Có phải tất cả các yêu cầu đến cùng một dịch vụ web/máy chủ không? Nó có thể là máy chủ mà không thích nó, hoặc bạn có thể mất lợi thế 'keepalive' HTTP của bạn bằng cách làm 10 đơn vị công việc trên 100 chủ đề. Yêu cầu có lớn không? Băng thông có thể là một nút cổ chai. –
Có, các yêu cầu đến cùng một dịch vụ web. Số lượng các chủ đề là ít hơn số lượng yêu cầu, trên thực tế tôi thử nghiệm nó với 2 hoặc 3 chủ đề. Yêu cầu nhỏ, chỉ vài thẻ xml. –