IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

InputStream + performance


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 92
    Par défaut InputStream + performance
    Bonjour,

    J'ai développé une petite application qui utilise une connexion Url pour récupérer un fichier HTML présent sur un de mes serveurs web, puis qui extrait différentes images/fichier en fonction du contenu de cette page.

    Hors lors de mes tests, il apparait que les performance que ce soit lors de la lecture de la page ou la copie des fichiers sont vraiment pas terrible.

    Pour la lecture de la page, j'utilise le mode de chargement suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	URL url = new URL("http://www.monsite.com");
    		InputStreamReader ipsr = new InputStreamReader(url.openStream());
    		BufferedReader br = new BufferedReader(ipsr);
    		String line = null;
    		String lineRes="";
    		while ((line = br.readLine()) != null) {
    		      if(id==0){}else{
    			lineRes+="\n"+line;
    			}
    		      id++;
    		}
    Le telechargement des images de la manière suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	URL   url  = new URL(tmp);
    	URLConnection urlC = url.openConnection();
    	InputStream is = url.openStream();
    	FileOutputStream fos=null;
    	fos = new FileOutputStream("/sdcard/IMG_/"+this.tab[IMG]+"/"+file);
    	int oneChar, count=0;
    	while ((oneChar=is.read()) != -1){
    		fos.write(oneChar);
    		count++;
    	}
    	is.close();
    	fos.close();
    Comment puis je améliorer les performances lors de la récupération des flux ?

    Cordialement

  2. #2
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    Salut,

    Concernant les performances, tu peux regarder du coté de DDMS, et surveiller un peu ce qu'il se passe au niveau mémoire.
    Ensuite tu peux essayer de threader un peu tout ça afin de ne pas bloquer ton appli (si ce n'est pas déjà fait).
    Enfin, quelques petites remarques sur ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    URL url = new URL("http://www.monsite.com");
    InputStreamReader ipsr = new InputStreamReader(url.openStream());
    BufferedReader br = new BufferedReader(ipsr);
    String line = null;
    String lineRes="";
    if ((line = br.readLine() != null) {
      while ((line = br.readLine()) != null) {
         lineRes+="\n"+line;
      }
    }
    ça t'évitera de faire un test à chaque tour de boucle.
    Ensuite, pour ton téléchargement d'image, au lieu de lire byte par byte, tu peux directement lire un buffer de byte, ça devrait être un petit peu plus rapide.

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Le problème de performance ne vient pas de l'InputStream, mais de la concaténation de String dans une boucle, qui produit un grand nombre d'objet temporaire.

    Il faut utiliser un StringBuilder !


    De plus, pourquoi lire le fichier ligne par ligne si tu veux le reproduire en entier. Autant le lire directement par bloc...

    Enfin il manque les b]try/finally[/b] pour la libération propre des ressources...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	URL url = new URL("http://www.google.fr");
    	StringBuilder builder = new StringBuilder();
    	InputStreamReader reader = new InputStreamReader(url.openStream());
    	try {
    		char[] cbuf = new char[8192];
    		int len;
    		while ( (len=reader.read(cbuf)) >= 0 ) {
    			builder.append(cbuf, 0, len);
    		}
    	} finally {
    		reader.close();
    	}
    	String lineRes = builder.toString();

    a++

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 92
    Par défaut
    Merci à tous les deux pour vos conseils, effectivement maintenant cela va mieux !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [maintenance][performance] Que faire comme maintenance ?
    Par woodwai dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 06/11/2003, 15h39
  2. Performance xml
    Par MicKCanE dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 07/07/2003, 06h41
  3. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 16h18
  4. [JDBC][connexion persistante] performances avec JDBC
    Par nawac dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 06/05/2003, 10h37
  5. performance entre 3DS, ase, asc ...
    Par amaury pouly dans le forum OpenGL
    Réponses: 3
    Dernier message: 24/03/2003, 11h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo