Forum Clubic

Problème d'optimisation java

Bonjour, voici ci dessous un exercice ou l’on me demande d’optimiser un code, 3 choses :
je n’ai jamais fais d’optimisation, je ne connais pas l’objet LinkedList et je ne connais pas l’objet calendar.
Pouvez-vous m’aider ou c’est peine perdue pour moi ? ^^

Merci d’avance.

Vous devez optimiser la fonction java « fctAmeliorable». Il est possible 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.
Écrivez une version optimisée de cette fonction.

public final List fctAmeliorable() {
List locDbValueList = new LinkedList ();
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 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
public final List fctAmeliorable() {

}

Pour LinkedList & Calendar :

docs.oracle.com…
docs.oracle.com…

En regardant ton code en clair, y a effectivement plusieurs points d’optimisation. Mais ton exercice étant là pour t’apprendre, j’aimerais d’abord savoir si tu y as réfléchi et ce que tu vois comme points de lenteur.

Salut.

J’ai l’impression que ton prof met un peu la charrue avant les beaufs. Tu es dans une AFPA?

Tu ne peux pas résoudre l’exo si tu n’as pas déjà eu un cours, même minimal, sur les collections.

Comme celui là par exemple:
fmora.developpez.com…

Quelques indices pour te mettre sur la voie :

Pour la première boucle: à partir du moment où tu te dis qu’un appel de fonction et une instanciation prend forcément un peu de temps, tu devrais savoir comment simplifier ça.

Pour la deuxième boucle: dans le lien que j’ai donné au dessus, lis la partie qui explique le fonctionnement d’une liste chainée (partie 3.1), tu comprendras vite pourquoi l’utilisation de get(i) dans une boucle est à proscrire.

Je te conseille aussi fortement de intéresser à la notion d’itérateur, indispensable à connaitre:
fmora.developpez.com…
docs.oracle.com…

(Et dans ton cas, c’est précisément ce qui va te faire le plus gagner en perf).
Edité le 21/02/2013 à 00:17

Vu que tu as commencé à expliquer les choses, j’ajouterai l’auto-boxing qui dans le cas présent ne sert à rien.

Merci de ta réponse, en fait, je regarde le code j’ai vraiment du mal à comprendre ce qu’il fait. Pour les points de lenteur, la première boucle for affecte des valeurs à une liste pour les changer juste après avec la méthode updateList, je pense que ici il serai plus simple d’affecter directement une taille 50000 à notre liste et de la modifier par la suite non ?
Ensuite la deuxième boucle for récupère les valeurs des années et les additionnes c’est ça ? Vraiment bizarre cette fonction …


PS : J'avais pas vu les autres commentaires en fait ...