2011-01-11 40 views
9

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.

+0

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. –

+1

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. –

+0

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. –

Trả lời

15

Tất cả đều rất đơn giản. HttpClient cho mỗi mặc định chỉ cho phép hai kết nối đồng thời vào cùng một máy chủ đích theo yêu cầu của đặc tả HTTP. Vì vậy, hiệu quả chủ đề công nhân của bạn dành phần lớn thời gian thực hiện của họ bị chặn chờ đợi cho hai kết nối để trở thành có sẵn.

Bạn nên tăng giới hạn 'kết nối tối đa trên mỗi tuyến đường' để giảm/loại bỏ tranh chấp chuỗi công nhân.

Bạn cũng có thể muốn kiểm tra điểm chuẩn được sử dụng bởi dự án Apache HttpComponents để đo lường hiệu suất của HttpClient.

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

+0

Điều này có vẻ như những gì tôi cần, cảm ơn! –

0

Tôi nghi ngờ việc chuyển ngữ cảnh có hiệu suất kém với trình quản lý an toàn luồng và bạn nên ngừng sử dụng nó. Tôi cho rằng bạn có thể so sánh máy khách Apache với máy khách Java mặc định, nhưng tôi không nghĩ rằng bạn sẽ thu được nhiều lợi ích về hiệu năng.

Cá nhân, tôi đã tìm thấy trình phân tích cú pháp XML DOM có chút chậm, vì vậy nếu bạn đang sử dụng cải cách XML, điều này có thể hữu ích. Tùy thuộc vào ứng dụng của bạn, bạn có thể yêu cầu các mục trước khi bạn cần chúng hoặc sử dụng bộ nhớ đệm để tạo ra mức độ người dùng tốt hơn, nhưng chúng tôi cần biết thêm để cung cấp cho bạn lời khuyên có ý nghĩa.