Integer Napisano Wrzesień 17, 2010 Zgłoś Share Napisano Wrzesień 17, 2010 Witam. procedure TObRG.Obszar_SzukajAll(_BmpRGB: TBitmap); var X, Y: Integer; X3: Integer; p,p1,p2: pbytearray; ws1, ws2:^Byte; r,g,b: Byte; begin _BmpRGB.PixelFormat:= pf24bit; FBmpPrev.Assign(_BmpRGB); // Szukanie od góry początkÓW obszarÓW, z pominięciem pixela ramki ----------- Y:= 1; // 0 Repeat p:= FBmpPrev.Scanline[y]; // żródło X:= 1; // 0 Repeat x3:= x shl 2; Inc(x3, x); // pobieranie wartości pierwszej składowej koloru // b:= p[x3]; Inc(x3); g:= p[x3]; Inc(x3); r:= p[x3]; //Inc(x3); //if not Point_Tlo(r, g, B) then Obszar_WyznaczOne(x, y); // jeśli to nie punkty tła if (r=255) or (g=255) then Obszar_WyznaczOne(x, y); Inc(X, cSz2ObszIncX); Until (X>= FBmpPrev.Width-2); // -1 Inc(Y, cSz2ObszIncY); Until (Y>= FBmpPrev.Height-2); // -1 fmMain.MInf.Lines.Add(' obsz '+IntToStr(FLsOb.cnt)); end; hvwŁ z;3z:kĄź,:3ś3*zZaH[Ę N^[ĘĘNHN[ĘĘNHN[ĘĘN i dajie mi to zysk z ~850 msec na ~320msec na całym działaniu kodu a jak ten sam trick zastosuje w innej pod-procedurze to czas mi się wydłuża z tych ~320 na ~1400. różnica jest taka że w kodzie procedury dla przypadku ~320 zmienna x3 i x jest zadeklarowana w procedurze a dla procedury ~1400 x jest parametrem wejściowym - o ile to powinno mieć jakieś znaczenie. Czy ktoś wie skąd się takie niekorzystne różnice w czasie przeciwne do zamierzonych biorą? Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Wrzesień 17, 2010 Zgłoś Share Napisano Wrzesień 17, 2010 sama zamiana na takie sztuczki to za malo. Krytyczne jest aby w metodzie bylo jak najmniej zmiennych, optymalnie to 2-3. Wtedy operacje sa robione na rejestrach i odpada kod asma ktory przerzuca rejestry na stos i z powrotem. Ogolnie jak czesto przeplatasz rozne zmienne po calej metodzie w sposob ktory uniemozliwia kompilatorowi rozdzielenie ich wg czasu zycia to wydajnosc tez spada bo musi przerzucac zmienne pomiedzy stosem a rejestrami. Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Integer Napisano Wrzesień 17, 2010 Autor Zgłoś Share Napisano Wrzesień 17, 2010 No tak tylko..., może ja się źle wyraziłem , zamieniłem x3:= 3*x; na x3:= x shl 2; Inc(x3, x); czyli w tym kontekście operuję na tych samych zmiennych a tylko sposób się zmienił. Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.