Probleme de Vitesse ou plutot probleme de comprehension ...
Nicolas___
Messages postés992Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention24 avril 2013
-
16 janv. 2006 à 18:55
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 2022
-
16 janv. 2006 à 22:49
voila mon probleme
les types sont definis avant
puis ds une procedure il y a ceci
:=
var
Scan,ScanIMG : TypePRGBArray;
x,y:integer;
ir,iv,ib,mv,mb,mr,Fin: Integer;
begin
gauge1.MaxValue:=image.Picture.Bitmap.Height-1 ;
for y:=0 to image.Picture.Bitmap.Height-1 do
begin
gauge1.Progress:=y;
Scan := image.picture.Bitmap.ScanLine[Y];
for x:=0 to image.Picture.Bitmap.Width-1 do
begin
// Valeurs en rouge vert et bleu
mR := Scan[X].Rouge;
mV := Scan[X].Vert;
mB := Scan[X].Bleu;
// Transo en rgb
fin:=rgb(mr,mv,mb);
fin:=rgb(Scan[X].Rouge,Scan[X].Vert,Scan[X].Bleu ) shr 4;
OU
fin:=rgb(Scan[X].Rouge,Scan[X].Vert,Scan[X].Bleu ) shr edit1.text;
Voila le probleme est que qd je mets
fin:=rgb(Scan[X].Rouge,Scan[X].Vert,Scan[X].Bleu ) shr 4;
la vitesse est tres rapide
mais qd je mets
fin:=rgb(Scan[X].Rouge,Scan[X].Vert,Scan[X].Bleu ) shr edit1.text;
et que la valeur de edit1.text:=4
le tps de traitement est bcp plus long
(Tester sur les m images pr bien faire !)
POURQUOI ????? !
Merci
Ciao
A voir également:
Probleme de Vitesse ou plutot probleme de comprehension ...
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 16 janv. 2006 à 20:33
dans le cas de shr 4 le compilateur affecte directement la valeur dans
le code qui se résume en un chargement de l'accumulateur et une
instruction de décalage cela ne doit guère dépasser une trentaine de
cycle horloge.
dans le cas ou tu mets strtoint((edit1.text) tu as en gros le le code suivant:
chargement de l'adresse de edit1.text (~4 instructions);
appel de la routine strtoint avec passage des parametres ( 5 à 10 instructions)
conversion (cela doit représenter entre 50 et 100 instructions)
retour de la routine (5 à 10 instructions)
affection du résultat à shr (2 à 3 instructions)
exécution de shr ..... OUF!!
comme tu le constates on passe de 2 instructions à ~100 à 200 soit un rapport de presque 1 à 100
il est donc normal
fin:=rgb(Scan[X].Rouge,Scan[X].Vert,Scan[X].Bleu ) shr edit1.text;soit beaucoup plus lente
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 16 janv. 2006 à 21:14
Attention Fin doit etre de type TColor et non de type Integer!
FOR x := 0 TO Image.Picture.Bitmap.Width-1 DO BEGIN
Fin := ((Scan[x].Rouge SHL 16) + (Scan[x].Vert SHL 8) + (Scan[x].Bleu)) {..>>}
// decalage de N bits
{<<..} SHR IntToStrDef(Edit1.Text,0);
// ou pour decaler de N octets
// {<<..} SHR (IntToStrDef(Edit1.Text,0)*8); Scan[x].Rouge : = byte(Fin SHR 16);
Scan[x].Vert := byte(Fin SHR 8);
Scan[x].Bleu := byte(Fin);
END;
<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 16 janv. 2006 à 21:18
Buglol :
<strike>SHR IntToStrDef(Edit1.Text,0);</strike>
SHR StrToIntDef(Edit1.Text,0);
<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 16 janv. 2006 à 21:59
Beuh.... ? Le resultat de RGB(r,g,b) n'est pas non plus un TColor alors puisqu'on balance un cardinal dans un Tcolor,est-ce que balancer un Tcolor dans un Integer c'est si catastrophique ? ( je stocke une couleur dans le tag de mes controls et c'est bien pratique)
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 16 janv. 2006 à 22:27
oui c'est vrai ... vus que TColor n'est rien d'autre qu'un integer...
mais disons que c'est plus parlant ... quand on analyse le code.
il me semblais que TColor avait une particularitée par rapport a integer mais j'ai confondus avec un autre type...
donc en effet ... ma remarque n'est pas a prendre en compte.
hum d'ailleur en parlant de ça j'ai vus une autre erreur dans le truc, sortir la convertion de Edit1.text de la boucle... tout comme l'a dis JLen100 en fait... :
VAR decal : byte;
begin
...
Decal := IntToStrDef(Edit1.Text,0);
FOR y ...
...
FOR x : = 0 TO Image.Picture.Bitmap.Width-1 DO BEGIN
Fin := ((Scan[x].Rouge SHL 16) + (Scan[x].Vert SHL 8) + (Scan[x].Bleu)) SHR Decal;
Scan[x].Rouge := byte(Fin SHR 16);
Scan[x].Vert := byte(Fin SHR 8);
Scan[x].Bleu := byte(Fin);
END;
END; ...
...
<hr size ="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 16 janv. 2006 à 22:49
lol decidement :
je la refait en plus courte
FOR x := 0 TO Image.Picture.Bitmap.Width-1 DO BEGIN
WITH Scan[x] DO BEGIN
Fin := ((Rouge SHL 16) + (Vert SHL 8) + (Bleu)) SHR Decal;
Rouge := byte(Fin SHR 16);
Vert := byte(Fin SHR 8);
Bleu := byte(Fin);
END;
END;
<hr size ="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>