lien entre objets vs rapidité du programme

lien entre objets vs rapidité du programme

by Gaëtan Emmanuel Mancini -
Number of replies: 2

Bonjour, 

Dans le cadre du projet, nous avons été amené à coder une méthode retournant une matrice de changement de base, ainsi qu'une autre méthode retournant un vecteur de l'une des deux bases exprimé dans l'autre. Les deux objets étant liés, nous avons utilisé la matrice (et même sa transposée dans un des deux sens, la transposée étant égale à l'inverse) que nous avons multipliée avec un vecteur pour obtenir le résultat voulu. Du coup, cette méthode est peu optimale, nécessitant une opération de transposition et une multiplication matrice vecteur. Dès lors, je voulais savoir si garder ce lien était tout de même la meilleure option ou si, du moment que les deux bases que l'on va utiliser correspondent toujours à la même méthode de matrice, nous pouvions expliciter le vecteur à retourner, sans utiliser la multiplication matrice-vecteur, ce qui nous donnerait un code "plus rapide" à l'exécution.

In reply to Gaëtan Emmanuel Mancini

Re: lien entre objets vs rapidité du programme

by Deleted user -
Hello!
C'est bien que tu t'inquiètes de la performance de ton code bien que ce ne soit pas strictement un des buts du projet. Tout d'abord, pour votre méthode, vous pouvez selon moi faire ce raccourci si les méthodes dont tu nous parles ne sont utilisé qu'à cette opération.

En ce qui concerne l'optimisation: beaucoup de facteurs peuvent jouer sur la vitesse d'exécution, donc ma 1ère question serait de savoir si vous avez identifié ce bout là du code comme lent, ou si c'est une hypothèse.
Avant de commencer à optimiser, il faut en général toujours mesurer la performance d'un code avec des outils adaptés ("profilers") pour déterminer la cause d'un ralentissement. Il est possible que ton code soit lent à cause de certaines copies mal placées (et pas optimisées par le compilateur) et non des manipulations de matrice.
Sous Linux, on peut par exemple compiler avec '-pg' et utiliser gprof.

Si profiler ton code te semble un peu trop gros comme investissement, remarques aussi que tu peux demander au compilateur d'optimiser l'exécutable qu'il produit avec le flag '-Ox' où x=0,1 ou 2, avec '-O2' qui est le niveau le plus fort d'optimisation. -O3 existe aussi mais ne garantit pas que le code se comporte comme celui sans optimisation.
In reply to Gaëtan Emmanuel Mancini

Re: lien entre objets vs rapidité du programme

by Jean-Cédric Chappelier -

ce que dit Louis est correct, mais je voudrais aussi répondre sous un autre angle : conception.

Il est aussi bon en terme de conception d'identifier les invariants ; c'est un peu le sens de votre question (si cette matrice, cette séquences d'opérations, etc., est toujours la même, pourquoi ne pas éviter de la recalculer). Identifier les invariants et les montrer comme tels est toujours une bonne chose. Pour cela il faut « tracer » de quoi ils dépendent (et ce qu'ils influencent) et ne faire en effet leur recalcul que quand cela est strictement nécessaire.
Pour de telles conceptions, il est donc bon de faire le graphe des dépendances entre les variables/concepts du programme (p.ex. si theta change alors ça, ça et ça doivent changer).

Par exemple dans votre « flot de calcul », une fois qu'on est dans une base donnée, il n'y a plus de changement à faire (la matrice de passage est alors invariante, c'est l'identité) ; l'«invariant» à identifier dans ce cas est peut être la notion de « base » elle-même : et ne lancer le calcul de la matrice QUE lorsque l'on change de base (au lieu de la recalculer à chaque fois que l'on demande un vecteur ; p.ex. si j'ai bien compris votre exemple). A la limite dans un exemple aussi simple, la « base » est elle-même représentée par la matrice de passage ; à ne recalculer QUE quand elle change (pour garder le même esprit).