Comment Calculer le ratio de performance «selon tutorial de cari » [Résolu]

Messages postés
121
Date d'inscription
mercredi 22 novembre 2000
Dernière intervention
4 août 2010
- - Dernière réponse : cs_Jean_Jean
Messages postés
641
Date d'inscription
dimanche 13 août 2006
Dernière intervention
13 décembre 2018
- 10 nov. 2007 à 14:33
Bonjour tout le monde ; après la lecture du tutorial « TACTIQUES D’OPTIMISATION DE <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /??><st1:personname w:st="on" productid="LA VITESSE D'EXECUTION">LA VITESSE D'EXECUTION</st1:personname> DU CODE «  de caribensila j’ai constater qu’il effectues des testes sur différentes méthodes et fonctions et il donne l’avantage à l’une ou l’autre selon  un ratio de performance, ben  je  cherche bêtement à savoir comment on calcule ces ratios Est-ce que on utilise : un chrono , existe-il un composant ou utilitaire pour ça … !<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>



Alors, je demande @caribensila de nous parler de la méthode .
Et si d’autres développeurs ont une autre  méthode ou technique, qu’ils nous éclairent merci pour tous.







Remarque
 : j’ai poser cette question ici pour que tout le monde profite de la réponse .    
Afficher la suite 

Votre réponse

20 réponses

Meilleure réponse
Messages postés
4307
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
2 janvier 2019
34
3
Merci
pour avoir une idée globale des perf, GetTickCount suffit amplement :

var GTADD, GTDIV : cardinal;

procedure .... ;
begin
  GTADD := GetTickCount;
  For N := 1 to 10000000 do X := 22 + 8;
  GTADD := GetTickCount - GTADD;

  GTDIV := GetTickCount;
  For N := 1 to 10000000 do X := 22 / 8;
  GTDIV := GetTickCount - GTDIV;

  caption := format('Add=%d ms / Div=%d ms',[GTADD, GTDIV]);
end;

<hr size="2" width="100%" />
http://deefaze.gnomz.com

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 124 internautes nous ont dit merci ce mois-ci

Commenter la réponse de f0xi
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
12
3
Merci
Salut,

@Khawarizm
Remarque le " f





or N := 1 to 10000000
" de f0xi...
C'est parce que souvent, on est obligé de faire de très nombreuses itérations pour pouvoir obtenir une valeur de temps "mesurable".

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 124 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Caribensila
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
12
3
Merci
C'est une fonction Windows qui renvoie le nombre de millisecondes écoulé depuis le lancement du système.


Ici
pour plus de précisions sur cette fonction.

@+

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 124 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Caribensila
Messages postés
4307
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
2 janvier 2019
34
3
Merci
GetTickCount et GetPerformanceMonitor apparaissent dans l'aide du SDK windows, qui doit etre installé quand l'install delphi le demande :)

note aussi que dans :

  GTADD := GetTickCount;
  For N := 1 to 10000000 do X := 22 + 8;
  GTADD := GetTickCount - GTADD;

on mesure egalement le temps que prend la boucle FOR.

si on fait :

  GTADD := GetTickCount;
  For N := 1 to 10000000 do X := 22 + 8;
  GTADD := GetTickCount - GTADD;

et

  GTADDTotal := 0;
  for N := 1 to 10000000 do
  begin
    GTADD := GetTickCount;
    X := 22 + 8;
    GTADDTotal := GTADDTotal + GetTickCount - GTADD;
  end;

tu remarquera une trés grosse difference! (GTADDTotal = 0)
car le temps que prend  l'instruction ADD est  inferieur au millieme de secondes (~0.0000000001 secondes sur un cpu a 1Ghz).

il faudrat donc faire :

  GTADDTotal := 0;

  for N := 1 to 10000000 do

  begin
    GTADD := GetTickCount;
      X := 22 + 8;   X := 44 + X;
      X := 22 + 8;   X := 44 + X;
      X := 22 + 8;   X := 44 + X;
      X := 22 + 8;   X := 44 + X;
      X := 22 + 8;   X := 44 + X;
    GTADD := GetTickCount - GTADD;
    GTADDTotal := GTADDTotal + GTADD;

  end;
  GTADDTotal := GTADDTotal * 10;

<hr size="2" width="100%" />
http://deefaze.gnomz.com

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 124 internautes nous ont dit merci ce mois-ci

Commenter la réponse de f0xi
Messages postés
1270
Date d'inscription
samedi 14 août 2004
Dernière intervention
5 avril 2012
3
3
Merci
Bonjour,

il serait bon pour mesurer les temps de penser à changer la priorité du thread de l'application :

var
  MainThread  : THandle;
  OldPriority : Integer ;
begin
  // Recupération de l'ID du thread principal, celui de l'appli
  MainThread := GetCurrentThread;
  // Sauvegarde de la priorité en cours
  OldPriority := GetThreadPriority( MainThread ) ;
  // Priorité la plus haute possible pour l'application.
  // Attention au boucles trop grandes, car le reste va être gelé brrrr ;P
  SetThreadPriority(MainThread, THREAD_PRIORITY_TIME_CRITICAL);
  try
    // Calculs ici
  finally
    // Restauration de l'ancienne priorité
    SetThreadPriority(MainThread, OldPriority);
  end ;
end;

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 124 internautes nous ont dit merci ce mois-ci

Commenter la réponse de WhiteHippo
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
12
3
Merci
... Et la remarque de Whitehippo répond à la question de notre ami :

« si je répète la fonction ou la procédure j'ai chaque foie une valeur différente (entre 60 et 90 ms) je veux savoir à quoi est du ce changement .Merci »

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 124 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Caribensila
Messages postés
641
Date d'inscription
dimanche 13 août 2006
Dernière intervention
13 décembre 2018
1
3
Merci
je m'insère dans la discussion. juste pour dire que j'utilise une autre méthode :
{1}
  QueryPerformanceFrequency(TInt64((@Frequency)^));  label4.Caption :'Fréquence '+ inttostr(Frequency);
  QueryPerformanceCounter(TInt64((@lpPerformanceCount1)^));
  {- ici 1ère fonction à tester ---------------------------------------------------------}


Ma procedure 1 à tester;


  {- Fin 1ère fonction---------------------------------------------------------}
  QueryPerformanceCounter(TInt64((@lpPerformanceCount2)^));
  QueryPerformanceFrequency(TInt64((@Frequency)^));
  label2.caption := IntToStr(Round(1000000 * (lpPerformanceCount2 -
                                              lpPerformanceCount1) / Frequency));
  QueryPerformanceFrequency(TInt64((@Frequency)^));  label4.Caption :'Fréquence '+ inttostr(Frequency);


{2}
  QueryPerformanceCounter(TInt64((@lpPerformanceCount1)^));
  {- ici 2ème fonction --------------------------------------------------------}


Ma deuxième procedure à tester pour comparer les temps;

  {- Fin 2ème fonction---------------------------------------------------------}
  QueryPerformanceCounter(TInt64((@lpPerformanceCount2)^));
  QueryPerformanceFrequency(TInt64((@Frequency)^));
  label3.caption := IntToStr(Round(1000000 * (lpPerformanceCount2 -

Désolé, je pars qlq jours (sans delphifr, snif), alors je prendrai vos commentaires à mon retour!

Jean_Jean

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 124 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Jean_Jean
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
1
3
Merci
En effet, on t'a un peu embrouillé l'esprit avec tout ça.

Alors, pour te répondre, il faut mesurer le temps d'exécution de toute la boucle puis soustraire le temps d'exécution de la boucle seule. Ainsi, il ne te reste que le temps de l'intérieur, que tu peux diviser par le nombre d'itération si tu le souhaite.
En attendant mon appli ? Ben justement, elle vient d'arriver ici: http://www.delphifr.com/codes/MESURER-PERFORMANCES-VOS-FONCTIONS-ANAYLSE-DIFFERENTES-OPERATIONS-SUR_44599.aspx

Le code que tu devra réutiliser se trouve dans UPerformanceCounterAPI.pas, le reste étant une application de ce code pour en faire un exemple concret.

Si les temps varient, c'est parce que Windows fait autre chose en même temps, donc ça ralentit. Et comme Windows ne fait pas toujours la même chose, ça ne ralentit pas toujours de la même façon. Donc tu as des temps qui varient.
C'est pour cela qu'il faut faire de très grandes boucles qui durent plusieurs secondes, pour avoir une moyenne moins sensible à ces changements.

@Jean_Jean:
Ta méthode et tout à fait celle que je décris. Si tu remplaces la "deuxième méthode" par la boucle vide, tu obtiens un moyen, non pas de comparer deux temps, mais de le mesurer !

Snif, tu pars quelques jours ! Mais snif pour nous, pas pour toi ! (enfin, moi je serai ravi de pouvoir partir...)

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 124 internautes nous ont dit merci ce mois-ci

Commenter la réponse de florenth
Messages postés
121
Date d'inscription
mercredi 22 novembre 2000
Dernière intervention
4 août 2010
1
0
Merci
Salut F0xi , salut Cari ; je vous remercie pour vos réponses , effectivement j’ai 20 ms pour Add et 30 ms pour Div  . @cari : oui j’ai remarquer le nombre élevé d’itération ; maintenant j’ai bien chercher « GetTickCount » sur l’aide de DELPI mais je trouve rien !!!
Commenter la réponse de khawarizm
Messages postés
121
Date d'inscription
mercredi 22 novembre 2000
Dernière intervention
4 août 2010
1
0
Merci
Merci les gars et merci pour le lien  , ça va m’aider à améliorer mes codes surtout que je m’initier au GLCene et ce dernier bouffe trot de temps et de CPU.
Commenter la réponse de khawarizm
Messages postés
121
Date d'inscription
mercredi 22 novembre 2000
Dernière intervention
4 août 2010
1
0
Merci
Bonsoir tout le monde ,bonsoir F0xi ; merci beaucoup pour tes explications , j’ai bien tester tes nouveaux codes mais  il y à quelque chose que je n’arrive pas a comprendre : <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>







Avec le deuxième code :








 







GTADDTotal := 0;
  for N := 1 to 10000000 do
  begin
    GTADD := GetTickCount;
    X := 22 + 8;
    GTADDTotal := GTADDTotal + GetTickCount - GTADD;
  end;








 








« tu remarquera une trés grosse difference! (GTADDTotal = 0) »









 







Effectivement,  j’ai constater un changement mais GTADDTotal n’affiche pas  0 chez moi il affiche entre 60 et 90 ms !!! sur un CPU a 1Ghz d
euxième remarque : si je répète la fonction ou la procédure j’ai chaque foie une valeur différente (entre 60 et 90 ms) je veux savoir à quoi est du ce changement .Merci
Commenter la réponse de khawarizm
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
1
0
Merci
Salut !

Hola f0xi, je croyais que GetTickCount était aussi précis qu'un lancer de vache sur un TGV roulant à 350km/h !!!!!

Sérieusement, tu oublies pas mal de détails dans ton calcul de performances, même si j'obtiens les mêmes résultats que toi (mais pour un processeur de 1.8Ghz avec HT):
<ol><li>Le fait que tu dois donner des valeurs aléatoires à calculer (sinon c'est le compilo qui calcule ! et tu mesures alors le temps d'une copie de mémoire)</li><li>Mieux vaut mesurer toute la boucle, puis diviser par le nombre de fois qu'on a bouclé.</li><li>Se méfier de la précision de m**** des flottants (utiliser l'api de Cari pour le calcul)</li><li>Du coup, en faisait ça, tu rajoutes la nécessité de calculer un temps "à vide".</li></ol>Je posterai un code (si j'en ai le temps) pour montrer ce qu'on obtient véritablement.

++
Flo

PS: du coup, c'est moi qui re-deviens fou d'optimisation ^^

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
Commenter la réponse de florenth
Messages postés
121
Date d'inscription
mercredi 22 novembre 2000
Dernière intervention
4 août 2010
1
0
Merci
Bonjour tout le monde ; et bien si j’ai bien compris d’après
F0xi il faut récupérer GetTickCount
à l’intérieur de la boucle pour éviter de mesurer  le temps que prend  celle-ci en ajoutant un ensemble
de calcule et en multipliant par 10  pour
avoir un temps plus ou moins vrais. Alors que Florent nous dit qu’il vaut
mieux  mesurer toute la boucle
puis diviser par le nombre de fois qu'on a bouclé avec calcule de valeurs aléatoires pour faire travailler
le CPU et inviter de mesurer le temps d'une copie de mémoire (la réponse
à ma question d’après cari). OK , dans ce cas là le temps pris par la boucle est comptabiliser
ou pas  Et à propos de la priorité du thread de l'application de
WhiteHippo ,que je trouve très logique, mais malheureusement ne règle  pas grand chose ???!!!


En tout les cas j’ai appris pas mal de choses grace à vous   même si
je ne suis pas encor satisfait Merci beaucoup les gars   attendant l’apli de

Florent.
Commenter la réponse de khawarizm
Messages postés
121
Date d'inscription
mercredi 22 novembre 2000
Dernière intervention
4 août 2010
1
0
Merci
Bonsoir tous ; bonsoir florenth je viens de télécharger
ton appli. je la dévore , à première vue tous est là GetTickCount de F0xi
priorité du thread de l'application de WhiteHippo   et l’api de cari , plain de commentaires
et  d’explication et en un  temps record ,bravo ! Je te remercie beaucoup,
j’y retourne le temps de digérer tout ça.






PS : @Cari : qui attirer mon intention sur
la remarque de WhiteHippo ( j’ai mi les parenthèses au mauvais endroit ) effectivement
elle renfermait implicitement une
part de la réponse à ma dernière question : merci Cari
Commenter la réponse de khawarizm
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
15
0
Merci
Tester quelques procédures avec GetTickCount ou QueryPerformanceCounter
au pied levé çà peut servir...
Mais si l'application comporte de nombreuses procédures et fonctions, pour ma part, j'utilise un Profiler qui me donne l'ordre de passage, les temps d'exécution du programme dans chaque méthode et le nombre de passes réalisées.

...et quand on examine les résultats,
on a souvent des sacrés surprises.

cantador
Commenter la réponse de cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
15
0
Merci
Mais bien sûr, si le profiler permet de trouver aisèment les goulots d'étanglements, il ne donne pas la solution pour les optimiser :

d'où l'intérêt des sources déposées par cari, Florenth etc..

cantador
Commenter la réponse de cs_cantador
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
1
0
Merci
@Cantador: oui, je me suis aussi fait un petit programme qui m'indique le temps passé dans chaque routine, le nombre d'appels et le temps passé dans les sous-routines.
Et en effet, ça laisse des surprises !

Mais néanmoins, si tu souhaite optimiser une routine en particulier (comme une routine mathématique, ou un traitement de chaînes ou de bitmaps), alors il est plus judicieux de la tester "à part" avec des saisies aléatoires, plutôt que de faire générer un rapport sur le programme puis de l'exploiter.

Je verrai si je publie aussi mon petit "profiler" perso, à moins que tu ne me donne un lien vers un bon profiler (je n'en avais pas trouvé à l'époque...)

++

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
Commenter la réponse de florenth
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
15
0
Merci
"..alors il est plus judicieux de la tester "à part".."

Tout à fait d'accord avec toi florenth.


Pour les profilers, j'en utilise deux :
un gratuit très connu (avec source): GpProfile
qui mériterait bien un petit coup de fraîcheur depuis le temps qu'il existe
(la dernière mise à jour a été réalisée pour Delphi 5..)



http://17slon.com/gp/gpprofile/files.htm


et un autre
 
ProDelphi : deux versions une light (free) et
une Pro (payante)
et fonctionne pour toutes versions.


Le principe est le même dans les deux produits :
On commence par poser des balises encapsulant TOUTES les méthodes
puis on exécute (ce qu'on veut) aboutissant à un tableau des résultats.



http://www.prodelphi.de/



et c'est vraiment très pratique mais cruel aussi, car si on passe le profiler au bout de 6 mois de développement on pleure devant le tableau final !

cantador
Commenter la réponse de cs_cantador
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Dernière intervention
8 avril 2009
1
0
Merci
'tain comment c'est chiant qu 'InTime n'accepte pas du Delphi.

Nan paske Intime, ca encapsule XP, et ca fait tourner XP dans un serveur de scrutation.

L'avantage c'est qu'intime vient avec une api, qui quand on l'utilise dans un prog en C++ sous Visual, va aller fair tourner la fonction désirée en temps réel en dehors de XP,  dans Intime lui meme, puis par un mécanisme adapté, rappatrier les données de la fonction dans le code sous XP.

Et là, dans cet espace où un code est non-préemptible le temps de son execution, on peut mesurer précisement le temps de chaque truc.

Think Twice, Code Once !
Commenter la réponse de DeltaFX
Messages postés
641
Date d'inscription
dimanche 13 août 2006
Dernière intervention
13 décembre 2018
1
0
Merci
 ça gamberge dur!  Bravo pour la richesse de vos échanges, quel plaisir?!
Il va me falloir une secrétaire pour classer tout ça, Ah s'il n'y avait que Delphi dans la Vie?

Bien à vous!

Jean_Jean
Commenter la réponse de cs_Jean_Jean

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.