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

Java Discussion :

[Performance]Comment optimiser la vitesse ?


Sujet :

Java

  1. #1
    Membre habitué Avatar de le Daoud
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2002
    Messages : 287
    Points : 169
    Points
    169
    Par défaut [Performance]Comment optimiser la vitesse ?
    Bonjour,

    Je suis entrain de coder un jeu de reflexion type echecs. Je voudrais savoir quels sont les élements au niveau langage que je pourrais améliorer pour augmenter les performances de l'analyse.

    Par exemple, une exception qui est levée puis catchée prend-elle beaucoup de temps, vaut-il mieux faire un test préalable ? Dans mon programme, si une pièce essaye d'aller sur une case qui n'existe pas, une exception ArrayIndexOutOfBound est levée puis catchée, est-ce trop consommateur ?
    Un ArrayList offre-t-il un accès rapide comme un tableau ?
    D'autres idées ?

    merci
    daoud

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    Il est toujours préférable de tester des bornes plutôt que de catcher un ArrayOutOfBoundException oui, ainsi que toutes autres exceptions ne serais-ce que pour éviter l'instanciation de la classe d'exception ( l'instantiation est couteuse ) !

    Quand à l'utilisation de List ( ou dérivé ) en lieu et place d'un tableau n'est pas justifiée dans ton cas car tu est sur un tableau à limites déterminées et de taille très réduite ( 8x8 )

    Enfin, ceci n'est qu'un avis qui n'engage que moi

  3. #3
    Membre habitué Avatar de le Daoud
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2002
    Messages : 287
    Points : 169
    Points
    169
    Par défaut
    Merci pour ta réponse

    Je vais changer pour les exceptions.
    Sinon, le plateau du jeu n'est pas un échiquier (=>dvonn), mais a une structure irrégulière et les pièces se déplacent en fonction de la hauteur d'une pile de pièce. J'ai codé cela avec un tableau, d'où ma gestion d'exception. Mais j'ai aussi créé une List qui contient uniquement les pièces que l'on peut déplacer pour gagner du temps.

    a+
    daoud

  4. #4
    Membre confirmé
    Avatar de Glob
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2002
    Messages : 428
    Points : 630
    Points
    630
    Par défaut
    Hello.
    Principalement:
    1) Éviter des instanciations d'objets ("new" et quasi toutes les opérations sur String)
    2) Éviter les méthodes récursives (pas forcément applicable à une IA type alpha-beta)
    3) Si tu as des listes à parcourir en entier, bosse avec des ArrayList; pour les parcourir, utilise toArray() et parcours le tableau obtenu (peut-être pas compatible avec le point 1, j'ai pas vérifié si on obtient une copie du tableau interne).
    ++

  5. #5
    Membre habitué

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2002
    Messages : 125
    Points : 150
    Points
    150
    Par défaut
    dans le Commons Collection d'Apache, il me semble qu'il y a des Fast Array qui ont un mode lecture/écriture et un lecture seule bcp plus rapide.

  6. #6
    Membre confirmé
    Avatar de Glob
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2002
    Messages : 428
    Points : 630
    Points
    630
    Par défaut
    Merci pour le lien.

    http://jakarta.apache.org/commons/collections/apidocs-COLLECTIONS_3_1/org/apache/commons/collections/FastArrayList.html


    Cependant, pour des opérations avec un seul thread, le bon vieux ArrayList est plus rapide... et plus portable...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 44
    Points : 52
    Points
    52
    Par défaut
    Bonjour,

    Comme tout le monde l'a dit ici, les tableaux sont bien plus rapides que les listes car tu accède à un élément en une unité de temps (t[i]). Alors que dans une liste, il te faut parcourir tous les éléments jusqu'à tomber sur celui que tu recherches.

    Citation Envoyé par le Daoud
    Sinon, le plateau du jeu n'est pas un échiquier (=>dvonn), mais a une structure irrégulière et les pièces se déplacent en fonction de la hauteur d'une pile de pièce. J'ai codé cela avec un tableau, d'où ma gestion d'exception. Mais j'ai aussi crée une List qui contient uniquement les pièces que l'on peut déplacer pour gagner du temps.
    Vu la structure de "l'échiquer", une matrice ne serait pas je pense une bonne idée. Si j'ai bien compris la hauteur de chaque case est variable et donc tu risques de te retrouver avec une grosse matrice peu remplie.
    Je pense (et ca n'engage que moi ) que le plus éfficace serait de créer un tableau de listes.
    Ainsi tu as un accés direct à chaque case et aprés un parcours pour la hauteur.



    Citation Envoyé par Glob
    (peut-être pas compatible avec le point 1, j'ai pas vérifié si on obtient une copie du tableau interne)
    On obtiens bien une copie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        public Object[] toArray() {
    	Object[] result = new Object[size];
    	System.arraycopy(elementData, 0, result, 0, size);
    	return result;
        }
    Bon courage

    Ben

  8. #8
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 864
    Points : 3 437
    Points
    3 437
    Par défaut
    Citation Envoyé par Glob
    Cependant, pour des opérations avec un seul thread, le bon vieux ArrayList est plus rapide... et plus portable...
    J'ai fais plusieurs applications avec les collections de jakarta, et dans tous les cas ça s'est avéré plus rapide que ceux de base de Java ( notamment lors du changement de mode de lecture seule ).
    Et en ce qui concerne la portabilité, je ne vois pas en quoi elle serait impactée, aurais-tu une argumentation à ce sujet ? Non pas que je veuille te contredire, mais je serais curieux de savoir ce qui te fait penser celà.

    K

  9. #9
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par benohite
    Comme tout le monde l'a dit ici, les tableaux sont bien plus rapides que les listes car tu accède à un élément en une unité de temps (t[i]). Alors que dans une liste, il te faut parcourir tous les éléments jusqu'à tomber sur celui que tu recherches.
    Juste une petite rectification : Cela dépend de quelle implémentation de List tu utilises...
    Les ArrayList utilisent des tableaux et la différence est donc minime avec l'utilisation d'un tableau standard...

    Pour plus d'info, voir http://java.developpez.com/faq/java/...IONS_info_list.

    a++

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 44
    Points : 52
    Points
    52
    Par défaut
    Effectivement je parlais de listes dans le sens du C, c'est a dire des listes chainées (via pointeurs) et non des tableaux deguisées : ).


    Ben

  11. #11
    Membre confirmé
    Avatar de Glob
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2002
    Messages : 428
    Points : 630
    Points
    630
    Par défaut
    Citation Envoyé par KiLVaiDeN
    Citation Envoyé par Glob
    Cependant, pour des opérations avec un seul thread, le bon vieux ArrayList est plus rapide... et plus portable...
    J'ai fais plusieurs applications avec les collections de jakarta, et dans tous les cas ça s'est avéré plus rapide que ceux de base de Java ( notamment lors du changement de mode de lecture seule ).
    Et en ce qui concerne la portabilité, je ne vois pas en quoi elle serait impactée, aurais-tu une argumentation à ce sujet ?
    K
    Hello.
    Pour la portabilité, je me réfère simplement à la javadoc du FastArray:
    NOTE: This class is not cross-platform.
    Maintenant, peut-être que cette info est fausse ou que... bref.

    En ce qui concerne la vitesse, j'ai pas eu (et j'aurai pas avant longtemps) le temps de faire des tests, mais je reste persuadé qu'un ArrayList.toArray() suivi d'un parcours du tableau ainsi obtenu reste plus rapide. Sauf peut-être dans le cas inintéressant où l'on a 3 éléments.

    J'ai du mal à concevoir qu'il existe quelque chose de plus rapide qu'un tableau[] pour accéder à des éléments de façon indexée, ou pour parcourir une liste. Même le parcours ordré d'une liste par pointeur nécessite des additions d'adresses mémoire.

    Je ne suis pas même certain de pouvoir obtenir de meilleurs résultats avec une méthode native en C++: le changement de contexte d'exécution Java -> C -> Java a un coût...

    M'enfin, pour un jeu d'échec ça doit pas être critique à ce point, c'est quand même pas un MMORPG (sans vouloir dénigrer)

  12. #12
    Membre habitué

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2002
    Messages : 125
    Points : 150
    Points
    150
    Par défaut
    sinon, une méthode qui n'a rien a voir, tu peux faire en sorte que les éléments de ton tableau réagissent à un evenement donné. ensuite tu lance l'événement sur tous tes éléments et tu récupère ceux qui ont répondu.

  13. #13
    Membre habitué Avatar de le Daoud
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2002
    Messages : 287
    Points : 169
    Points
    169
    Par défaut
    Merci à vous pour vos réponses.

    En ce qui concerne les exceptions le gain de temps à été très net.
    Pour les tableaux, la différence est moins importante mais tout de même significative pour la mettre en oeuvre. Par exemple pour une même position avec le même nombre de noeuds explorés j'ai gagné 10% de temps sur la fonction d'évaluation.
    Voici la partie du code modifiée avec en commentaire ce qu'il y avait avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //Iterator iter = plateau.getCasesJouables().iterator();
    Object[] tab = plateau.getCasesJouables().toArray();
    //while(iter.hasNext()){
    for(int i = 0; i < tab.length; i++){
      //c = (Case)iter.next();
      c = (Case)tab[i];
    peut-être que la différence aurait été moins significative si j'avais utilisé l'accès direct aux éléments plutôt que l'itérateur, mais je ne crois pas.

    Sinon je réflechis à ton idée jcarre, mais je ne suis pas sur de l'avoir bien saisie.

    Merci à tous

    daoud

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 34
    Points : 40
    Points
    40
    Par défaut
    je ne vois pas l'interet du toArray() qui provoque une recopie du tableau.
    Tu utilises une ArrayList, classe qui implemente RandomAccess. Or toute liste qui implemente cette interface sera parcourue plus rapidement par un "for( ...) { la_liste.get(i) ... }" que par un iterateur. Passer par un tableau te fournis certe un gain par rapport a un iterateur, mais le for/get est encore meilleur. Dans tous les cas, l'iterateur est a proscrire pour toutes les listes de l'API standard, a l'exception des LinkedList, seules listes a ne pas implementer RandomAccess.

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

Discussions similaires

  1. Comment calculer la vitesses de convergence d'un algorithme d'optimisation?
    Par MaybeStrong dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 05/09/2013, 21h50
  2. comment optimiser la vitesse de chargement d'un site qui est sur un CD-rom ?
    Par clavier12AZQSWX dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 05/10/2009, 00h53
  3. Comment optimiser les performances de mon PC ?
    Par Celebrate dans le forum Windows XP
    Réponses: 6
    Dernier message: 16/07/2008, 22h08
  4. Comment optimiser une jointure ?
    Par seb_asm dans le forum Administration
    Réponses: 21
    Dernier message: 25/06/2004, 16h42
  5. Comment repérer la vitesse du processeur?
    Par Paradam dans le forum Assembleur
    Réponses: 14
    Dernier message: 28/06/2003, 10h43

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