Performance Android HttpClient

Je développe une application Android qui utilise beaucoup de requêtes http pour le service Web. Au début, j'étais en train de créer une nouvelle instance HttpClient avant chaque demande. Pour augmenter les performances, j'essaie de faire des requêtes dans de nombreux threads. Donc, j'ai créé une instance HttpClient unique, partagée par tous les threads, à l'aide de 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); 

Mais la performance a diminué, à ma grande surprise. J'ai mesuré le temps, pour être dépensé pour exéclamer les demandes de cette manière:

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

Voici un journal, que je reçois avec DefaultHttpClient simple sans paramètres nouvelle instance par demande:

 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 

Et ce que je reçois avec ThreadSafeClientConnManager et une instance HttpClient unique:

 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 

Que se passe-t-il et comment puis-je combattre cela?

METTRE À JOUR

Utilisez l'avantage keep-alive – c'est ce que je veux. Mais lorsque je crée une nouvelle instance HttpClient pour chaque connexion de requête ne peut pas être réutilisé. En dépit de cela, une telle version fonctionne plus rapidement, les raisons ne sont pas claires pour moi.

2 Solutions collect form web for “Performance Android HttpClient”

Tout est très simple. HttpClient par défaut permet seulement deux connexions simultanées au même hôte cible que celles requises par la spécification HTTP. Ainsi, efficacement, vos threads de travail passent la plupart de leur temps d'exécution bloqué en attendant que ces deux connexions soient disponibles.

Vous devez augmenter la limite 'max connections per route' pour réduire / éliminer la contention du thread de travail.

Vous voudrez peut-être vérifier la référence utilisée par le projet Apache HttpComponents pour mesurer les performances de HttpClient.

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

Je soupçonne que le changement de contexte entraîne de mauvaises performances avec le gestionnaire thread safe, et vous devriez arrêter de l'utiliser. Je suppose que vous pourriez comparer le client Apache avec le client Java par défaut, mais je ne pense pas que vous obtiendrez un gain de performance.

Personnellement, j'ai trouvé que l'analyseur DOM XML était un peu lent, donc, si vous utilisez XML reformtiing, cela pourrait vous aider. Selon votre application, vous pouvez demander des éléments avant de les avoir ou utiliser la mise en cache pour créer une meilleure expierence de l'utilisateur, mais nous devrions en savoir plus pour vous donner des conseils significatifs.

coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.