Comment Calculer le ratio de performance «selon tutorial de cari »

Résolu
khawarizm Messages postés 116 Date d'inscription mercredi 22 novembre 2000 Statut Membre Dernière intervention 4 août 2010 - 2 nov. 2007 à 14:42
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre 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 .    

19 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
2 nov. 2007 à 15:09
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
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
2 nov. 2007 à 15:21
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".
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
2 nov. 2007 à 16:00
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.

@+
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
2 nov. 2007 à 20:22
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
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
3 nov. 2007 à 15:53
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
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
3 nov. 2007 à 16:06
... 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 »
3
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
3 nov. 2007 à 19:15
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
3
khawarizm Messages postés 116 Date d'inscription mercredi 22 novembre 2000 Statut Membre Dernière intervention 4 août 2010 1
2 nov. 2007 à 15:51
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 !!!
0
khawarizm Messages postés 116 Date d'inscription mercredi 22 novembre 2000 Statut Membre Dernière intervention 4 août 2010 1
2 nov. 2007 à 16:24
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.
0
khawarizm Messages postés 116 Date d'inscription mercredi 22 novembre 2000 Statut Membre Dernière intervention 4 août 2010 1
2 nov. 2007 à 22:23
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
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
3 nov. 2007 à 13:09
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
0
khawarizm Messages postés 116 Date d'inscription mercredi 22 novembre 2000 Statut Membre Dernière intervention 4 août 2010 1
3 nov. 2007 à 18:51
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.
0
khawarizm Messages postés 116 Date d'inscription mercredi 22 novembre 2000 Statut Membre Dernière intervention 4 août 2010 1
3 nov. 2007 à 22:28
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
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
4 nov. 2007 à 00:47
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
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
4 nov. 2007 à 11:37
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
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
4 nov. 2007 à 11:50
@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
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
4 nov. 2007 à 13:07
"..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
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
6 nov. 2007 à 17:05
'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 !
0
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
10 nov. 2007 à 14:33
 ç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
0
Rejoignez-nous