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

khawarizm 121 Messages postés mercredi 22 novembre 2000Date d'inscription 4 août 2010 Dernière intervention - 2 nov. 2007 à 14:42 - Dernière réponse : cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention
- 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
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 2 nov. 2007 à 15:09
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

Merci f0xi 3

codes-sources a aidé 87155 internautes ce mois-ci

Commenter la réponse de f0xi
Meilleure réponse
Caribensila 2674 Messages postés jeudi 15 janvier 2004Date d'inscription 11 mai 2018 Dernière intervention - 2 nov. 2007 à 15:21
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".

Merci Caribensila 3

codes-sources a aidé 87155 internautes ce mois-ci

Commenter la réponse de Caribensila
Meilleure réponse
Caribensila 2674 Messages postés jeudi 15 janvier 2004Date d'inscription 11 mai 2018 Dernière intervention - 2 nov. 2007 à 16:00
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.

@+

Merci Caribensila 3

codes-sources a aidé 87155 internautes ce mois-ci

Commenter la réponse de Caribensila
Meilleure réponse
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 2 nov. 2007 à 20:22
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

Merci f0xi 3

codes-sources a aidé 87155 internautes ce mois-ci

Commenter la réponse de f0xi
Meilleure réponse
WhiteHippo 1270 Messages postés samedi 14 août 2004Date d'inscription 5 avril 2012 Dernière intervention - 3 nov. 2007 à 15:53
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

Merci WhiteHippo 3

codes-sources a aidé 87155 internautes ce mois-ci

Commenter la réponse de WhiteHippo
Meilleure réponse
Caribensila 2674 Messages postés jeudi 15 janvier 2004Date d'inscription 11 mai 2018 Dernière intervention - 3 nov. 2007 à 16:06
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 »

Merci Caribensila 3

codes-sources a aidé 87155 internautes ce mois-ci

Commenter la réponse de Caribensila
Meilleure réponse
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 3 nov. 2007 à 19:15
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

Merci cs_Jean_Jean 3

codes-sources a aidé 87155 internautes ce mois-ci

Commenter la réponse de cs_Jean_Jean
Meilleure réponse
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 3 nov. 2007 à 20:29
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

Merci florenth 3

codes-sources a aidé 87155 internautes ce mois-ci

Commenter la réponse de florenth
khawarizm 121 Messages postés mercredi 22 novembre 2000Date d'inscription 4 août 2010 Dernière intervention - 2 nov. 2007 à 15:51
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
khawarizm 121 Messages postés mercredi 22 novembre 2000Date d'inscription 4 août 2010 Dernière intervention - 2 nov. 2007 à 16:24
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
khawarizm 121 Messages postés mercredi 22 novembre 2000Date d'inscription 4 août 2010 Dernière intervention - 2 nov. 2007 à 22:23
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
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 3 nov. 2007 à 13:09
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
khawarizm 121 Messages postés mercredi 22 novembre 2000Date d'inscription 4 août 2010 Dernière intervention - 3 nov. 2007 à 18:51
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
khawarizm 121 Messages postés mercredi 22 novembre 2000Date d'inscription 4 août 2010 Dernière intervention - 3 nov. 2007 à 22:28
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
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 4 nov. 2007 à 00:47
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
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 4 nov. 2007 à 11:37
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
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 4 nov. 2007 à 11:50
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
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 4 nov. 2007 à 13:07
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
DeltaFX 459 Messages postés lundi 19 avril 2004Date d'inscription 8 avril 2009 Dernière intervention - 6 nov. 2007 à 17:05
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
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 10 nov. 2007 à 14:33
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.