Fonctionne en debug mais pas en release? [Résolu]

Signaler
Messages postés
5
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
12 décembre 2005
-
Messages postés
5
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
12 décembre 2005
-
Voila je travail sous Visual 7

Je travail sur l'implementation d'un algorithme que je dois optimiser la vitesse d'execution.
Pour se faire j'utilise les fonction QueryPerformanceFrequency et QueryPerformanceCounter pour mesurer le temps de d'execution.

Tout se passe a merveille en mode debug, mais en release sa foire:
en fait je crois que le probleme viens de QueryPerformanceFrequency, car en debug il mesure une frequence de 3579545hz et 80hz!! en release.

Je voudrai savoir si la valeur de cette frequence est censee etre differente en debug et en release. Car si j'applique la frequence mesuree en debug sur les mesure de temps effectuee en Release et que je fais le calcul par moi meme, je trouve un temps d'execution coherent.

voila le code:

#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
....

long FreqHorloge,beginTime,endTime;


int main (void)
{

float T;
int i,j;

..........

QueryPerformanceFrequency((LARGE_INTEGER*)&FreqHorloge);
QueryPerformanceCounter((LARGE_INTEGER*)&beginTime);


..............................................
..............................................
ma fonction a analyser
..............................................
..............................................

QueryPerformanceCounter((LARGE_INTEGER*)&endTime);
T=(endTime-beginTime)/(float)FreqHorloge;




printf("Algorithm executed in %f sec\n",T); printf("freqHorloge %d, begin %d, end= %d \n",FreqHorloge,beginTime,endTime);

// Leave properly
printf("Press <Enter> to end.\n");
getchar();


return 0;
}


Donc voila, j'espere que quelqu'un pourra m'aider


J'en profite pour demander si quelqu'un ne connaitrai pas des bonnes sources pour apprendre a optimiser du code sous Visual:
Bouquin, tutorial, page web,etc....Ca me serai aussi tres utile


Voila merci d'avance

4 réponses

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Les variables FreqHorloge,beginTime,endTime ne sont pas du bon type.
Les fonctions PerfTimer demandent des LARGE_INTEGER qui sont en fait des entiers sur 64 bits. Or tu les déclares en long (32 bits) => il y a un écrasement des variables.

Pour un peu qu'en Debug les variables soit alignées sur 8 octets et en Release sur 4, ça marche en Debug mais pas en Release ( dans le cas d'alignement 8 octets, 4 octets vides sont laissés après chaque variable et du coup il n'y a pas décrasement).

Il faut donc déclarer :
LARGE_INTEGER FreqHorloge,beginTime,endTime;
ou (sous Visual)
unsigned __int64 FreqHorloge,beginTime,endTime; et caster comme tu l'a fait en LARGE_INTEGER(et là sera OK car les var sont compatibles)

Ensuite pour afficher tes var il faudra faire %I64u (ou%I64d) au lieu de %d

Si tu es sous visual il y a une option de linker appelée "Profiling" qui permet de faire ce que tu souhaites. Après avoir activer cette option (Project->settings, onglet link, categorie General) er recompiler le tout (Rebuil all) il suffit de démarrer le prog par
Build->Profile. A la fin de l'exécution tu auras des statistiques sur les fcts appelées et leur temps d'exec.
PS : ça c'est pour VC6, pour autre visual, doit exister mais je ne sais pas les manip à faire.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Pour résumer:

LARGE_INTEGER lideb, lifin;


QueryPerformanceCounter(&lideb);
// LANCE TA FONCTION ICI
QueryPerformanceCounter(&lifin);
lifin.QuadPart -= lideb.QuadPart;


Te suffira de comparer les différentes valeurs de lifin.QuadPart suivant optimisations de tes fonctions.

et ne pas faire de tests en debug mais compilé en release avec toutes optimisations du compilo.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
14982
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
2 mars 2021
94
Par définition, caluculer le temps d'exécution d'un code ne se fait pas
en Debug mais en Release pour être "indépendant de Visual"

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
5
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
12 décembre 2005

Ok,

merci bien pour ce coup de main qui m'a ete bien utile.

Pour ce qui est du profiling, je ne sais pas pourquoi, mais la fonction n'est pas disponible sur ma version de visual. en tout cas je la trouve pas. J'avais deja chercher pas mal de temps avant.
Pour cela j'utilise Intel Vtune Performance Analyzers. Mais c'est sur que se serai plus pratique d'avoir acces au profiling directement sous visual.

Desole si je met si longtemps a repondre, mais je suis a l'autre bout de la terre et j'ai 10h de decalage avec vous.

Merci encore