10. september 2004 - 00:54Der er
10 kommentarer og 1 løsning
Meget langsom for-løkke - kan man gøre noget?
Jeg har denne kode som "køre" et bitmap igennem og laver det om til gråtoner, mit problem er at jeg ikke kan forstå hvorfor C# er meget længere tid om det end f.eks Delphi
på min computer som er en 1.7 Ghz P4 tager det omkring et til to sekunder!!! Delphi gør det inden jeg kan nå at blinke en eneste gang... (Bmp’et er ca. 300 x 400 pixel)
Er der nogen der kan forklare mig om jeg gør noget forkert, eller kan gøre noget for at gøre den væsentlig hurtigere? Mit problem er at jeg skal køre ret mange bitmap igennem med mange løkker og det tager bunke tid...
Her er et eksempel på en af de mange løkker jeg bruger i mit program
public static Bitmap ConvertToGreyscale(Bitmap Bmp) { Bitmap Bmp1 = new Bitmap(Bmp.Width, Bmp.Height); Color PixelColor; for (int PixelY = 1; PixelY <= Bmp.Height-1; PixelY++) { for (int PixelX = 1; PixelX <= Bmp.Width-1; PixelX++) { PixelColor = Bmp.GetPixel(PixelX, PixelY); int Grey = (PixelColor.R + PixelColor.G + PixelColor.B)/3; Bmp1.SetPixel(PixelX, PixelY, Color.FromArgb(Grey, Grey, Grey)); } } return Bmp1; }
Ikke at jeg tror det har den store betydning, men der er vel ingen grund til at du definerer int grey inde i din for løkke? Den kunne vel lige så godt defineres uden for og dermed undgå at blive defineret for hver eneste pixel?
Jeg tror (og nu gætter jeg bare :)) simpelthen at det går så langsomt fordi du skal igennem løkken mange gange. Hvilket billede tester du på? et billede på fx 1280x1024 indeholder jo over 1,3 milloner pixels. Dvs at du komme igennem løkken 1,3 milloner gange. Det tager jo noget tid.... Alternativt kan det være at de metoder du bruger (fx BitMap.SetPixel) i sig selv er en "langsom" metode. Mon ikke der findes nogle metoder som kan sætte gamma eller farveskala generelt?
At initialisere variable udenfor løkken, i stedet for inden i den, burde ikke gøre nogen forskel. Moderne compilere, i hvert fald i Java-verdenen, ser den slags ting, og sørger selv for at optimere ved kun at allokere hukommelsen én gang for hele løkken. Det skulle undre mig meget, om ikke Microsoft har tænkt over det samme :-)
300x400 er kuen 120000 (og 120000 gennemløb tager ingen tid på en moderne CPU).
Jeg er helt overbevist om at forskellen mellem C# og Delphi ligger i metode kaldene (GetPixel, SetPixel).
Det betyder intet om den int er indenfor eller udenfor løkken.
Hvis du skulle prøve noget så skulle du lave en GreyColor struktur udenfor løkken og sætte værdier i den fremfor at konstruere en ny med FromArgb.
Men det tror jeg heller ikke betyder noget.
Hvis det var løkke overhead som var problemet så skulle vi til at kigge på loop unrolling, men formentlig gør .NET det af sig selv. Og det er ikke løkke overhead som er problemet.
Jeg kan glædeligt meddele jer at jeg har siddet op hele natten og skrevet alle mine mange løkker om og nu virker det endeligt og det er blevet MEGET hurtigere mange tak for hjælpen, det er bare kanon... :o)
vaco : Kan jeg ikke lige få et svar?
Og kan en iøvrigt fortælle mig hvad en pointer helt konkret er?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.