Szybkość pętli...

0

Witam

Możecie mi objaśnić, która pętla w delphi jest najszybsza? Potrzebuje użyć pętli zagnieżdżonej gdzie razem mają zrobić ok. 3000 powtórzeń i narysować coś na ekranie...Dotychczas używałem pętli for i można było zauważyć opóźnienie a w szczególności przy kilku powtórzeniach i na słabszych maszynach. Wiem, że może to też być wina funkcji rysującej (rysuje okręgi na płótnie Canvas używając Canvas.Ellipse(TRect);).

dzięki z góry!

0

zamiast
for i:=0 to 3000 do
używaj
for i:=3000 downto 0 do

bo porównywanie licznika do zera jest dużo szybsze,
a poza tym zrób sobie testy:

const Dl=1000000;
var T:array [0..3] od LongInt;
      i:longInt;
      d:LongInt;
begin
  i:=0;  d:=0;
  T[0]:=GetTickCount;
  for i:=0 to dl do d:=d+1;
  T[0]:=GetTickCount-T[0];

  i:=0;  d:=0;
  T[1]:=GetTickCount;
  for i:=dl downto 0 do d:=d+1;
  T[1]:=GetTickCount-T[1];

  i:=0;  d:=0;
  T[2]:=GetTickCount;
  repeat
    i:=i+1
    d:=d+1
  until i=dl; 
  T[2]:=GetTickCount-T[2];

  i:=0;  d:=0;
  T[3]:=GetTickCount;
  while i<>dl do
  begin
    i:=i+1
    d:=d+1
  end;
  T[3]:=GetTickCount-T[3];
  Showmessage(
  'for to: ' +IntToStr(T[0])+#13+
  'for down: ' +IntToStr(T[1])+#13+
  'repeat: ' +IntToStr(T[2])+#13+
  'while: ' +IntToStr(T[3])+#13)
end;
0

Szczrze mówiąc z tych testów nic nie wynika :(, ponieważ za każdym razem są inne wyniki (inne to znaczy bardzo zróżnicowane - brak faworyta) - zresztą możesz sprawdzić sam...

Ok, może zostawmy pętle, a spróbujmy inaczej, może istnieje jakiś dobry algorytm lub funkcja, która rysowała by na Canvasie coś o wiele szybciej, może jakoś w pamięci? Dokładnie chodzi o przerysowanie tych wszystkich kółek lub kwadratów kilka razy w ciągu sekundy (a jak wposmniałem będzie ich ok. 3000)...

0

no to zadaruj sobie canvas i sie przesiądź na OpenGl'a (w rysowaniu ok. 6 tys. czworokątów z texturami w przestrzeni 3D wyciąga ok. 30 klatek na sekunde)
a co do testów to sobie ze zrób kilkanaście/kilkadziesiąt razy policz średnią, odchylenie standardowe i bedziesz już wszystko wiedział. no i oczywiście <ort>powyłanczaj </ort>nie potrzebne programy ( a najlepiej włącz sobie to w trybie awaryjnym :d )

0

Masz może jakieś namiary na kursy OpenGL? Może mógłbyś mi przedstawić jakiś program, który demonstruje rysowanie kwadratu, elipsy...I z jakich bibliotek korzystasz?

pozdr

0

www.delphi.bajo.pl tu masz fajny kurs postaw OpenGL (pod Delphi :d) a raszta w artykułach NeHe ale w sumie chyba ci nie będa potrzebne jakieś super informacje.... to co potrzebujesz jest na bajo ;)

0

ok dzięki!

0

zamiast
for i:=0 to 3000 do
używaj
for i:=3000 downto 0 do

To akurat sam zrobi konpilator, o ile oczywiście uzna, że kodowi wewnątrz pętli to nie zaszkodzi.

0

aaaa to nie wiedziałem że mamy takie sprytne kompilatory :d , ale samemu to napisać nie zaszkodzi ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1