Probleme de Vitesse ou plutot probleme de comprehension ...

Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 - 16 janv. 2006 à 18:55
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 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;


//fin:=rgb(Scan[X].Rouge,Scan[X].Vert,Scan[X].Bleu ) shl 1;



Scan[X].Rouge := getRvalue(fin);
Scan[X].Vert := getGvalue(fin);
Scan[X].Bleu := getBvalue(fin);
end;
end;

image.Refresh;
gauge1.Progress:=0;

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

10 réponses

jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
16 janv. 2006 à 19:44
salut

tu es sur de ton expression shr edit1.text;?? normalement cela ne compile pas: shr n'admet qu'un integer comme argument et non un string

@+

jlen
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
16 janv. 2006 à 20:19
oui non excuse je suis sur mais j ai mis inttostr(edit1.text)

Deso oubli de ma part
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
16 janv. 2006 à 20:19
bordel plutot strtoint() j y arriverais !!!!!
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
16 janv. 2006 à 20:28
Enfin j ai trouve une parrade pour eviter le désagreable sentiment de perdre son tps

fin:=rgb(Scan[X].Rouge,Scan[X].Vert,Scan[X].Bleu ) shr valcr;

ou valcr est un integer que je fais varier grace a un Spinbutton

Mais le truc c pourquoi dirrectement a partir d'un (Spin ) Edit ca ralentit a ce point la le prog.

Au debut je pensais cela:

Vu que je dois realiser le StrToInt je perds du temps

Donc sol : Utulisation d'un SpinEdit qui donne un integer et la surprise , ca change rien donc

j utilise une variable et la tt est parfait !!!!

A rien comprendre

Si qqun comprend ...

Ciao
0

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

Posez votre question
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
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

@+

jlen
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
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>
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
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>
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
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)
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
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>
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
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>
0
Rejoignez-nous