Avatar billede dktekno Nybegynder
27. april 2008 - 12:58 Der er 9 kommentarer og
1 løsning

Hvordan laver jeg en hurtig for loop?

Jeg har en simpel for loop i delphi:

for i := 1 to antalElementer

Problemet er bare, at jeg ikke ved hvor mange antalElementer der bliver så der kan jo i princippet være 10.000 elementer, og det tager meget lang tid for den at løbe 10.000 igennem. Og jeg vil have den til at løbe 10.000 elementer igennem - på ingen tid!

Hvordan gør jeg det?
Skal jeg til et helt andet programmeringssprog eller er det bestemt af CPU'en eller hvad er årsagen? Og hvad er løsningen?
Avatar billede hrc Mester
27. april 2008 - 13:34 #1
Noget forvirrende fremstilling, men jeg kommer til at tro du ikke er bekendt med følgede:

  "while <boolsk udtryk> do begin end"

og

  "repeat until <boolsk udtryk>"
Avatar billede hrc Mester
27. april 2008 - 13:37 #2
Skal måske læse tekste lidt bedre... Jeg har selv testet Pascal (i fordums tid) mod en C compiler og der vandt Pascal'en på de flydende decimaltal.

Nu nævner du et loop, mens det er mere relevant at kigge på den kode der afvikles inde i det. Det er nok her der kan og skal optimeres.
Avatar billede hrc Mester
27. april 2008 - 13:39 #3
Prøv f.eks. at lave en "dum" for-løkke der laver ingenting 2 mia gange. Det går hurtigt! Det må være koden der er ineffektiv.

Skal du endelig have optimal fart på må du lave noget af koden i BASM (Borland Assembler - hedder sikkert CGASM nu).
Avatar billede dktekno Nybegynder
27. april 2008 - 15:00 #4
Til hrc:

Jeg har lavet en for-løkke som følger:

for i := 1 to 100000 do
  begin
    memo1.lines.add(inttostr(i));
  end;

- hvilket er en meget simpel for-løkke og den tager jo mange sekunder om at udføre.

Og den er jo langt fra de 2 mia. du nævnte.

Så avanceret kan memo1.lines.add da vel ikke være, eller hvad?
Avatar billede arne_v Ekspert
28. april 2008 - 01:45 #5
Jo.

Løkken i sig selv tager ingen tid.
Avatar billede a_nor Nybegynder
28. april 2008 - 08:53 #6
Har du prøvet at lave "memo1.hide" før for-løkken, og "memo1.show" efter? Sagt på en anden måde: Har du skærmopdatering i din for-løkke kan det meget vel tage lang tid!
Avatar billede hrc Mester
28. april 2008 - 09:47 #7
Du kan sætte lidt fut i det ved at bruge BeginUpdate og EndUpdate:

  Memo1.Lines.BeginUpdate;
  try
    for i := 1 to 100000 do
      Memo1.lines.add(IntToStr(i));
  finally
    Memo1.Lines.EndUpdate;
  end;

Har du nogle events koblet på din TMemo? Har ikke helt styr over om der trigges nogle hver gang du indsætter en linje. Måske slår BeginUpdate det fra; det har jeg ikke undersøgt, men hurtigere går det.

Kan ikke huske om det var dig der har spurgt om noget lignende hvor jeg foreslog at bruge et virtuelt listview. Det afhænger af hvor meget man skal kunne editere i data. Det er i alt fald nok den hurtigste måde at få noget på listeform.
Avatar billede martinlind Nybegynder
28. april 2008 - 15:41 #8
Jeg plejer at smide det i en TStringList som jeg sætter Lines := når den er fuld, så er der ikke noget der forstyrer.

Kan forresten tilføje at Delhi/Pascal er hurtige eller lige så hurtig som C#/C++ til loops, det har jeg checket :-)
Avatar billede dktekno Nybegynder
29. april 2008 - 10:16 #9
hrc - mange tak for oplysningerne.

Læg svar for point.
Avatar billede hrc Mester
29. april 2008 - 11:34 #10
Her er linket til der jeg prøver at forklare om det virtuelle listview:
  http://www.eksperten.dk/spm/826852?Esession=bfbd98c69d957ac6289abf1aca7d210f
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester