Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Prozedur beschleunigen.... (https://www.delphipraxis.net/35019-prozedur-beschleunigen.html)

gordon freeman 1. Dez 2004 15:39


Prozedur beschleunigen....
 
Hi Leute,
ich hab folgende Prozedur zur Berechnung aller Primzahlen von a bis b geschrieben.
Hier der Code:

Delphi-Quellcode:
var Primzahlen: array of boolean;
    a,b,i,primkandidat,nichtprim:integer;
    Start,Stop,Freq:int64;
    Liste:TStrings;
begin

Listbox1.Items.Clear;

a:=strtoint(edit1.text);
b:=strtoint(edit2.text);
SetLength(Primzahlen,b);


Primzahlen[1] := true;

for primkandidat:=2 to b do
    if Primzahlen[primkandidat]=false then
       begin
       nichtprim:=primkandidat*2;
       while nichtprim <= b do
          begin
          Primzahlen[nichtprim] := true;
          Inc(nichtprim,primkandidat);
          end;
       end;

for i:=a to b do
    if primzahlen[i] = false then
       Listbox1.Items.Add(inttostr(i));

Mit der Rechnung bin ich im großen und ganzen ziemlich zufrieden, nur an der Ausgabe hapert's noch. Im Moment gebe ich die Zahlen von a bis b in 'ner Listbox aus. Das dauert allerdings doch einige Zeit. Da ich die Ausgabe beliebig gestalten kann dürften die Zahlen auch z.B. in einer Datei gespeichert werden. Aber bei all meinen Versuchen, war die Listbox-Variante bis jetzt die schnellste. Da ich bei dieser Routine voll auf Schnelligkeit baue hab ich auch das
obligatorische Application.Processmessages weggelassen, also Vorsicht!


Egal welche Vorschläge jetzt kommen, ich kann alles gebrauchen, das den Code beschleunigt!

tia, gordon

jim_raynor 1. Dez 2004 15:41

Re: Prozedur beschleunigen....
 
Benutze ListBox1.Items.BeginUpdate vor und Listbox1.Items.EndUpdate nach der Schleife, wo die Einträge hinzugefügt werden.
Das verhindert, dass ständige neuzeichnen und sollte einiges an Zuwachs bringen.

Maa83 1. Dez 2004 15:45

Re: Prozedur beschleunigen....
 
also: wieso hast du ein array of Boolean?
nimm doch einfach eine StringListe und sage jedesmal statt Primzahlen[nichtprim] := true;

StringListe.Add(IntToStr(Primzahl));

danach kannst du dieses viel leichter ausgeben.

Dennoch kapier ich deine Methode nicht so ganz. Bekommst du damit wirklich nur Primzahlen?

gordon freeman 1. Dez 2004 15:53

Re: Prozedur beschleunigen....
 
@jim_raynor thx, das gibt 'ne Menge an Performance

@Maa83 Jepp, bekomme dabei nur Primzahlen raus. dAs ganze nennt sich das Sieb des "Sieb des Eratosthenes" einfach mal googeln, da gibts gute Erklärungen zu!

Phantom1 1. Dez 2004 20:47

Re: Prozedur beschleunigen....
 
Bei der ermittlung der primzahlen gibts noch was zu verbessern:

mach mal aus:
Delphi-Quellcode:
for primkandidat:=2 to b do
folgendes:
Delphi-Quellcode:
for primkandidat:=2 to trunc(sqrt(b)) do
mfg


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz