Optimisation code JAVA

Fermé
babyboystwo Messages postés 9 Date d'inscription lundi 24 janvier 2011 Statut Membre Dernière intervention 8 mars 2012 - 8 mars 2012 à 15:29
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 8 mars 2012 à 18:04
Bonjour,

Je souhaite optimiser la fonction java « fctAmeliorable» afin d'améliorer la rapidité d'exécution de la fonction sans modifier son comportement pour autant en utilisant de bonnes pratiques de code communes aux principaux langages orientés objet.

Note : la liste retournée par cette fonction n'est utilisée par les fonctions appelantes que pour des parcours.

Voici donc la fonction que je souhaite avoir une version optimisée.

public final List<Double> fctAmeliorable() {
List<Double> locDbValueList = new LinkedList<Double> ();
for (int i = 0; i < 50000; ++i) {
Calendar locMyCalendar = new GregorianCalendar ();
locDbValueList.add(getNewDbValue(locMyCalendar.get(Calendar.YEAR), i));
}
updateList(locDbValueList) ;
Integer locResult = 0 ;
for (int i = 0; i < locDbValueList.size(); ++i) {
final Integer locTempVal = doOperation(locDbValueList.get(i));
if (locTempVal != null) {
locResult += locTempVal;
}
}
applyResult(locResult) ;
return locDbValueList;
}

private Double getNewDbValue(int parYear, int parIdx) { ... }
private void updateList(List<Double> valList) { ... } // Modifie valeurs (mais pas la taille) de liste donnée en paramètre
private int doOperation (Double parDbRefValue) { ... }
private void applyResult (int parIntValue) { ... } // Applique un traitement en fonction du paramètre

Je vous demande juste quelques conseils pour pouvoir me situer
Merci d'avance.
A voir également:

2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 8/03/2012 à 16:13
Faire des get(i) sur une LinkedList c'est très moche (comprendre : pas optimal), si tu as besoin de faire des get(i) utilises une ArrayList, sinon utilises des Iterator (éventuellement implicites avec une boucle for each).

De plus utiliser des Integer (et les Wrapper en général) c'est plus lourd qu'utiliser directement un int, d'autant que du coup tu fais des tests de la valeur null qui sont inutiles (dans ton cas).

Exemple d'amélioration :

Integer locResult = 0 ;
for (int i = 0; i < locDbValueList.size(); ++i) {
final Integer locTempVal = doOperation(locDbValueList.get(i));
if (locTempVal != null) {
locResult += locTempVal;
}
}

int locResult=0;
for (Double d : locDbValueList)
    locResult += doOperation(d);
La confiance n'exclut pas le contrôle
1
babyboystwo Messages postés 9 Date d'inscription lundi 24 janvier 2011 Statut Membre Dernière intervention 8 mars 2012 1
8 mars 2012 à 17:07
t'as pas oublié la variable locTempVal dans la partie du code que t'as amélioré ?
1
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
8 mars 2012 à 18:04
Non, car elle ne servait à rien, si ce n'est vérifier qu'elle ne vaut pas null, or la méthode doOperation renvoie un int, donc c'est impossible d'obtenir null, du coup le seul intérêt de locTempVal c'est pour faire l'addition de locResult que je fais directement dans ma troisième ligne...
0