khawarizm
Messages postés116Date d'inscriptionmercredi 22 novembre 2000StatutMembreDernière intervention 4 août 2010
-
2 nov. 2007 à 14:42
cs_Jean_Jean
Messages postés615Date d'inscriptiondimanche 13 août 2006StatutMembreDernière intervention13 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 .
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 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".
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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;
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 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
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 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 »
cs_Jean_Jean
Messages postés615Date d'inscriptiondimanche 13 août 2006StatutMembreDernière intervention13 décembre 20183 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 ---------------------------------------------------------}
khawarizm
Messages postés116Date d'inscriptionmercredi 22 novembre 2000StatutMembreDernière intervention 4 août 20101 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 !!!
khawarizm
Messages postés116Date d'inscriptionmercredi 22 novembre 2000StatutMembreDernière intervention 4 août 20101 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.
khawarizm
Messages postés116Date d'inscriptionmercredi 22 novembre 2000StatutMembreDernière intervention 4 août 20101 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
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 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 ^^
khawarizm
Messages postés116Date d'inscriptionmercredi 22 novembre 2000StatutMembreDernière intervention 4 août 20101 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
khawarizm
Messages postés116Date d'inscriptionmercredi 22 novembre 2000StatutMembreDernière intervention 4 août 20101 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
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 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.
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 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...)
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 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..)
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.
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 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.
cs_Jean_Jean
Messages postés615Date d'inscriptiondimanche 13 août 2006StatutMembreDernière intervention13 décembre 20183 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?