Fonctionne en debug mais pas en release?

Résolu
serom00 Messages postés 5 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 12 décembre 2005 - 30 nov. 2005 à 02:39
serom00 Messages postés 5 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 12 décembre 2005 - 30 nov. 2005 à 23:33
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

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
30 nov. 2005 à 09:23
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.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 nov. 2005 à 11:38
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++
BunoCS Messages postés 15479 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 juin 2024 103
30 nov. 2005 à 08:51
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...
serom00 Messages postés 5 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 12 décembre 2005
30 nov. 2005 à 23:33
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
Rejoignez-nous