OVH Cloud OVH Cloud

Améliorer la vitesse ?

43 réponses
Avatar
ByB
Bonjour,

Je suis curieux de savoir si en remplaçant deux boucles imbriquées :

for (int i = 0;i<8;i++)
{

for (int j=0;j<8;j++)
{
FaireQuelqueChose(i,j);

}

}

par une seule boucle :

int i,j;
for (int x = 0;x<64;x++)
{

i = x % 8;
j = x/8;

FaireQuelqueChose(i,j);

}

je gagne quelque chose (en particulier en vitesse d'exécution du
programme) ou si cela ne change rien ?

Merci.


--
Ladra que muerde no perra. (Chespirito)

10 réponses

1 2 3 4 5
Avatar
Arnaud Meurgues
ByB wrote:

Où puis je trouver un profiler ?
Le logiciel Purify (auquel je peux avoir accès) est il un profiler ou
peut-il être utilisé comme tel ?


Non. Mais quantify, oui.

--
Arnaud

Avatar
Arnaud Meurgues
ByB wrote:

je gagne quelque chose (en particulier en vitesse d'exécution du
programme) ou si cela ne change rien ?


Vous perdez au moins en lisibilité et ça, c'est plus dommageable que
tout le reste.

--
Arnaud

Avatar
Sylvain
ByB wrote on 29/07/2006 03:15:

Je suis curieux de savoir si en remplaçant deux boucles imbriquées :
par une seule boucle :

int i,j;
for (int x = 0;x<64;x++){
i = x % 8;
j = x/8;
}


la division et plus encore le modulo compte bcp plus chers que le calcul
d'indice.

remplacer 2 boucles par une (est généralement inutile) et passerait plus
par un remplacement de 'int grid[8](8]' par 'int grid[64]'.


note; si vous ne trouvez pas de profiler, vous pouvez insérer qlq

long globalElapseN = 0L;
...

struct _timeb start;
_ftime(&start);

uneGrosseMethode();

struct _timeb end;
_ftime(&end);

globalElapseN += 1000L * (end.time - start.time) + end.millitm -
start.millitm;

et mesurer ainsi via qlq compteurs la méthode qui consume (globalement)
le plus, une fois localisée vous raffinez en mésurant ses sous fonctions
(cela ne mesure toutefois que des temps > à la ms; si les méthodes sont
plus rapides (ou si l'organisation globale ne permet pas d'isoler des
méthodes tournant en ce temps) la méthode est inapplicable.

Sylvain.

Avatar
Loïc Joly
On Sat, 29 Jul 2006 15:25:54 +0200, "ByB" :


En fait, je suis en train de développer un programme qui joue à
l'Othello, et je remarque que l'ordinateur met pas mal de temps à
trouver le coup qu'il veut jouer.



Donc, il te faut un profiler.
Si tu programmes avec g++, utilise gprof.
Sinon, pour Windows, j'aime assez LtProf <http://www.lw-tech.com> --
basique, mais il rend bien des services.


Visual C++, du moins à partir d'une certaine version et d'un certain
prix, est aussi livré avec un profiler.

--
Loïc


Avatar
Siguisbo Calliope
Fabien LE LEZ writes:

| Donc, il te faut un profiler.
| Si tu programmes avec g++, utilise gprof.

gprof avec C++, c'est pas top -- il faut linker statiquement plein de
trucs autrement ça donne rien.


Vous connaissez des alternatives à gprof ? Une rapide recherche m'a
ramené Quantify mais c'est commercial.

Si,-

Avatar
Gabriel Dos Reis
Siguisbo Calliope writes:

| > Fabien LE LEZ writes:
| > | Donc, il te faut un profiler.
| > | Si tu programmes avec g++, utilise gprof.
| > gprof avec C++, c'est pas top -- il faut linker statiquement plein de
| > trucs autrement ça donne rien.
|
| Vous connaissez des alternatives à gprof ? Une rapide recherche m'a
| ramené Quantify mais c'est commercial.

La dernière fois que j'ai essayé, j'ai utilisé oprofile, mais
(1) c'est un peu la croix et la banière ;
(2) cela ne marche que sous linux.

-- Gaby
Avatar
Jean-Marc Bourguet
"ByB" writes:

A peine arrivée chez Fabien LE LEZ, l'info suivante nous est retransmise :
On Sat, 29 Jul 2006 03:15:09 +0200, "ByB" :

je gagne quelque chose (en particulier en vitesse d'exécution du
programme) ou si cela ne change rien ?


À vue de nez, ça doit varier énormément suivant le compilateur et les
options de compilation. Mais il y a des chances pour que l'appel de la
fonction "FaireQuelqueChose" (s'il y a bien appel, i.e. si le compilo
n'a pas inliné "FaireQuelqueChose") prenne nettement plus de temps que
tout le reste.

Normalement, on ne se pose pas ce genre de questions, du moins pas a
priori : on programme de la façon la plus naturelle possible (ici, je
pense que c'est la version à deux boucles, mais ça dépend de ton
application), puis, si le besoin s'en fait sentir, on détecte les
goulots d'étranglement avec un profiler.



Où puis je trouver un profiler ?
Le logiciel Purify (auquel je peux avoir accès) est il un profiler ou
peut-il être utilisé comme tel ?


Non. Mais Quantify en est un. Je ne sais pas s'ils sont
disponibles séparément: chaque fois que j'ai eu accès à
l'un, j'ai eu accès à l'autre.

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Ploc
Sylvain wrote:
ByB wrote on 29/07/2006 03:15:

int i,j;
for (int x = 0;x<64;x++){
i = x % 8;
j = x/8;
}


la division et plus encore le modulo compte bcp plus chers que le calcul
d'indice.


Et le compilateur ne fait pas tilt en voyant qu'on divise par 8?
Plus generalement, je serais assez interesse par un bench relatif aux
divisions...


Avatar
pasde.hcyrano.spam
ByB wrote:

Merci pour vos conseils.
En fait, je suis en train de développer un programme qui joue à
l'Othello, et je remarque que l'ordinateur met pas mal de temps à
trouver le coup qu'il veut jouer.
Mon code est plein de parcours du tableau de jeu (de 8x8 cases) et je
cherchais un moyen d'accélérer les choses ...


bonjours,

un prog d'othello tres bonne idee ;-)

pour ameliorer la vitesse, la premiere chose a faire est de structurer
correctement les données.

pour la representation de l'othellier voir "mailbox" ou "bitboard" pour
commencer. un tableau 8*8 n'est pas une bonne idée (a la limite 10*10).

ensuite si ca t'interesse j'ai plein de liens
--
Bruno Causse
http://perso.wanadoo.fr/othello

Avatar
Alain Gaillard


Et le compilateur ne fait pas tilt en voyant qu'on divise par 8?


Normalement le compilateur va générer un décalage de bit au lieu d'un
intruction div.

--
Alain

1 2 3 4 5