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

serom00 5 Messages postés lundi 28 novembre 2005Date d'inscription 12 décembre 2005 Dernière intervention - 30 nov. 2005 à 02:39 - Dernière réponse : serom00 5 Messages postés lundi 28 novembre 2005Date d'inscription 12 décembre 2005 Dernière intervention
- 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
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
ymca2003 2070 Messages postés mardi 22 avril 2003Date d'inscription 3 juillet 2006 Dernière intervention - 30 nov. 2005 à 09:23
3
Merci
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.

Merci ymca2003 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de ymca2003
Meilleure réponse
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 30 nov. 2005 à 11:38
3
Merci
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++

Merci BruNews 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de BruNews
BunoCS 14173 Messages postés lundi 11 juillet 2005Date d'inscription 15 octobre 2018 Dernière intervention - 30 nov. 2005 à 08:51
0
Merci
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...
Commenter la réponse de BunoCS
serom00 5 Messages postés lundi 28 novembre 2005Date d'inscription 12 décembre 2005 Dernière intervention - 30 nov. 2005 à 23:33
0
Merci
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
Commenter la réponse de serom00

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.