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

Langage Java Discussion :

Optimisation de code java


Sujet :

Langage Java

  1. #1
    Débutant
    Inscrit en
    Avril 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 360
    Points : 132
    Points
    132
    Par défaut Optimisation de code java
    salut,
    j'ai ecri une fonction pour le calcul des ratios finaciers
    mais le temps d'execution est assez elevé,
    je cherche donc à optimisé le code java de telle maniere qu'il sera plus fiable et rapide,
    voila la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
        /** ===>>> Fonction de Calcul de la Valeur du Ratio **/
        private void mCalculer_actionPerformed(ActionEvent e) {
     
            String Modele = mModeleDesc.getText();
            String Date_debut = mDateDebut.getText();
            String Date_Fin = mDateFin.getText();
            String Requete_Insert = RequeteInsert_Data_Ratio;
            String Values = "";
            Vector V_Error = new Vector();
     
            /** Initialisation de table des Erreurs **/
            InitTableRatiosErronés();
            mModelRatioErronés.chargerVector(V_Error, vRatioErronesCols,vRatioErroneClasses);
     
            if( !Modele.equals("") && !Date_debut.equals("") && !Date_Fin.equals("") ) {
     
                /** Controle Des valeurs de dates   **/
                ControleDate(Date_debut, Date_Fin);         
                int Begin_Date = Integer.parseInt(Date_debut.split("/")[2]);
                int End_Date = Integer.parseInt(Date_Fin.split("/")[2]);
     
                /** Test Sur l'existance d'au moins un Ratio **/
                if( mTableRatioTraitement.getRowCount() >= 1 ){ 
     
                    /** ==>> Parcour de la Table des Ratios **/
                    for( int i = 0; i < mTableRatioTraitement.getRowCount(); i++ ){
     
                        if( mTableRatioTraitement.getValueAt(i,0) != null ) {
     
                              boolean Choix = (Boolean)mTableRatioTraitement.getValueAt(i,0);
     
                              /** Test sur la selection  d'un Ratio et l'existance d'une Societe **/
                              if( Choix == true && mTableSocieteTraitement.getRowCount() > 0 ){
                                     String Code_Ratio = mTableRatioTraitement.getValueAt(i,1).toString();
     
                                    /** ==>> Parcour de la Table Societe  **/
                                    for( int j = 0; j < mTableSocieteTraitement.getRowCount(); j++){
     
                                        if( mTableSocieteTraitement.getValueAt(j,0) != null && (Boolean)mTableSocieteTraitement.getValueAt(j,0) == true){
     
                                            String Societe = mTableSocieteTraitement.getValueAt(j,1).toString();
                                            String Formule_Ratio = GetFormule_Ratio(Code_Ratio,Modele);
                                            int k = 0;
                                            goTo_While : while((Begin_Date + k) <= End_Date ) { //===>>> Marge des Dates : Insertion pour les differentes dates
     
                                                int exist = IsTrouve_Ratio_Societe(Modele,Societe,Code_Ratio,Integer.toString((Begin_Date + k)));
     
                                                /** ==>>> le Ratio n'est pas Calculé pour la societe **/
                                                if( exist == 0 ) {  
     
                                                    Pattern pattern = Pattern.compile("("+Symbols+")|("+numbers+")|("+strings+")");
                                                    Matcher matcher = pattern.matcher(Formule_Ratio);
                                                    String Evaluer_Formule = "";
                                                    String Date_Ratio = String.valueOf(Begin_Date + k);  
                                                    double Valeur_Ratio = 0;
     
                                                   /**  ===>>> Parcour de la Formule   **/    
                                                    while ( matcher.find() ) { 
     
                                                       String Element = matcher.group();
                                                       String test_element = Element.trim().substring(0,1);
     
                                                       if( test_element.equals(":") ){
     
                                                              String val = GetValeur_Compte(Element.split(":")[1],Modele,Societe,Date_Ratio);
     
                                                              if ( val.equals("") ) {
                                                                Evaluer_Formule += "0.00";
                                                              } else {
                                                                  Evaluer_Formule += val;
                                                              }
     
                                                       } else {
                                                            Evaluer_Formule += Element;
                                                       }
                                                    }
     
                                                    /**  Bibliothèque du Calcul  **/                                           
                                                    Jep jep = new Jep();
                                                    try {
     
                                                          Requete_Insert = RequeteInsert_Data_Ratio;
                                                          Values = "";
                                                          jep.parse(Evaluer_Formule);
                                                          String valeur = jep.evaluate().toString();
     
                                                          /**  ===>>> Cas Erreur de calcul   **/                                         
                                                          if( valeur.trim().equals("Infinity") || valeur.trim().equals("NaN") ){ 
     
                                                              Vector v = new Vector();
                                                              v.add(Code_Ratio);v.add(Societe);v.add(valeur);v.add("31/12/" +(Begin_Date + k));
                                                              V_Error.add(v);
                                                              k++;
                                                              continue goTo_While;
     
                                                          } else {
                                                              Valeur_Ratio = Double.parseDouble(valeur);
                                                              Values = " VALUES ("+Modele+",'"+Code_Ratio.trim()+"','"+Societe.trim()+"',TO_DATE('31/12/"+Date_Ratio.trim()+"','dd/mm/yyyy') ,"+Valeur_Ratio+")";
                                                              Requete_Insert += Values;
                                                             // System.out.print("\n Requete_Insert " + Requete_Insert + "\n\n");
                                                              boolean ok = mDBaccess.execute_req_insert_update_con_commit(Requete_Insert);
                                                             // System.out.print("\n okokokok " + ok + "\n\n");
                                                          }  
                                                     }catch(JepException ex){
                                                        System.out.print( ex.toString() + "*****" + ex.getMessage() );  
                                                     }
                                                      k++;
                                              } else {
                                                  k++;
                                              }
     
                                          }// fin while  
                                       }
                                     } 
                                   }
                           }
                   }
                }
     
                /** Remplissage de la table Errors **/
                mModelRatioErronés.chargerVector(V_Error,vRatioErronesCols,vRatioErroneClasses);
                mCommun14.formatTableRows(mTableRatioErronés);
                mTableRatioErronés.getColumnModel().getColumn(0).setPreferredWidth(250);
                mTableRatioErronés.getColumnModel().getColumn(1).setPreferredWidth(250);
                mTableRatioErronés.getColumnModel().getColumn(2).setPreferredWidth(200);
                mTableRatioErronés.getColumnModel().getColumn(3).setPreferredWidth(200);
     
            } else {
                JOptionPane.showMessageDialog(this,"789");
                JOptionPane.showMessageDialog(this," Veuilliez Remplir Les Paramètres ","Avertissement",0);
            }
        }
    Merci

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Assez élevé, ça veut dire quoi ?
    Et met tout ton traitement dans un Thread à part, car la, ton interface graphique est bloquée le temps du calcul.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Points : 318
    Points
    318
    Par défaut
    Tu pourrais mettre "mTableRatioTraitement.getRowCount()" et "mTableRatioTraitement.getValueAt(i,0)" dans des variables, vu que tu t'en sers plusieurs fois.

    Ensuite, évite de déclarer des variables dans une boucle. Fais le plutôt en dehors (ex : boolean Choix, String Code_Ratio, ...)

    Enfin, pour tout ce qui est concaténation de chaines, préfère le StringBuffer et sa méthode append() plutôt que le + + +...

    C'est de l'optim de bas étage, ce n'est pas ça qui va changer du tout au tout et il est possible que le compilateur fasse déjà bien le boulot, mais on sait jamais !

    EDIT : par contre, les "é" dans des noms de variables et de méthodes, ça m'étonne........

  4. #4
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Bonjour, je peux me tromper mais voila ce que je te propose :
    - remonter la ligne String Formule_Ratio = GetFormule_Ratio(Code_Ratio,Modele); avant la boucle de parcours de la table société, puisque les valeurs ne changent pas.
    - as-tu besoin de faire un new Jep à chaque itération?
    - déclarer les variables locales avec des minuscules

    Ce qui est couteux ce sont les boucles, ce n'est pas forcément évident de plonger dans ton code. Pour optimiser il faut d'abord traiter les cas qui vont te faire sortir de la boucle.

  5. #5
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boolean ok = mDBaccess.execute_req_insert_update_con_commit(Requete_Insert);
    Est-ce que tu fais ici un accès à la base données? ce n'est pas ça qui prendrai du temps aussi?
    Si oui créé une Queue de requête que devra traiter un autre thread qui sera chargé d'exécuter les requêtes uniquement.

  6. #6
    Débutant
    Inscrit en
    Avril 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 360
    Points : 132
    Points
    132
    Par défaut
    re
    assez eleve ==> l'interface se bloque pendant le calcul

    pour le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boolean ok = mDBaccess.execute_req_insert_update_con_commit(Requete_Insert);
    c'est l'acces a la base de donnee il ne prend pas de temps
    je vais essayer de faire et suivre les conseils
    juste une remarque à propos des threads
    j'ai pas bien compris franchements.
    explique moi cette methode en utilisants les threads Merci

  7. #7
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par opensource Voir le message
    juste une remarque à propos des threads
    j'ai pas bien compris franchements.
    explique moi cette methode en utilisants les threads Merci
    Tu place l'intégralité du corps de la méthode actionPerformed dans un Thread de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private void mCalculer_actionPerformed(ActionEvent e)
    {
      new Thread( new Runnable()
      {
        public void run()
        {
          String Modele = mModeleDesc.getText();
          ...
        }
      }).start();
    Et ton interface ne se figera pas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  8. #8
    Débutant
    Inscrit en
    Avril 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 360
    Points : 132
    Points
    132
    Par défaut
    Merci, par ce que j'ai jamais travaillé avec les threads , ok je vais consulter la doc et je vais essayé de l'appliqué Merci pour l'aide, je te rend la reponse Merci

  9. #9
    Débutant
    Inscrit en
    Avril 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 360
    Points : 132
    Points
    132
    Par défaut
    la methode des threads est tous à fait pratique, mon probleme est résolu
    Merci bonne fin de journée

  10. #10
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Points : 317
    Points
    317
    Par défaut
    les threads sont incontournables, il faut s y mettre.
    Bonne continutation

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

Discussions similaires

  1. Optimisation d'un code java
    Par supcomingenieur dans le forum Langage
    Réponses: 3
    Dernier message: 07/05/2013, 19h18
  2. Optimisation code Java
    Par maccormick dans le forum Général Java
    Réponses: 22
    Dernier message: 04/05/2010, 18h17
  3. Optimisation code java
    Par artatnas dans le forum Général Java
    Réponses: 4
    Dernier message: 25/02/2009, 17h32
  4. Optimisation de code java
    Par michubuntu dans le forum Général Java
    Réponses: 9
    Dernier message: 23/01/2009, 16h42
  5. [JAVA / Out Of Memory] Aide pour optimiser du code
    Par shaun_the_sheep dans le forum Général Java
    Réponses: 7
    Dernier message: 06/02/2007, 09h58

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