Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Delphi Win32 Applikation schneller machen (https://www.delphipraxis.net/74194-delphi-win32-applikation-schneller-machen.html)

NeoXan 30. Jul 2006 10:41


Delphi Win32 Applikation schneller machen
 
Hallo,

ich habe folgendes "Problem". Zu erst durchsuche ich diverse Verzeichnisse rekursiv und baue mir eine Liste aus den Dateien vom Typ TStringlist. Dann gehe ich wie folgt diese Liste durch:

Delphi-Quellcode:
while( slFiles.Count > 0 ) do
begin
{...}
end;

Hierbei möchte ich noch anmerken, dass mir aufgefallen ist, dass diese Methode merklich langsamer läuft als mit einer ForToDo Schleife. Ich "muss" aber while nehmen, da ich den durchlauf jederzeit mit Break beenden möchte bzw. sich die Anzahl der Elemente in der Liste ändert, wenn jemand eine alternative hat, nur raus damit.


Delphi-Quellcode:
cFile vom Typ String
while( slFiles.Count > 0 ) do
begin
 cFile := slFiles[0];
 slFiles.Delete(0);
 for i:=0 to slFiles.Count-1 do
  { Hier wird der Hash der Datei bei slFiles[i] berechnet }
end;
Das ganze läuft bei einigen Dateien recht gut, aber ich habe da zum Teil 32k Dateien, welche sich in der Liste befinden und das bräuchte zunächst 90 Stunden, was nicht wirklich das Problem ist (Lösung hätte ich schon); sondern vielmehr, dass die Applikation beim laufen dann >90% Auslastung hat, selbst bei niedriger Priorität.

Wie könnte ich die Auslastung der Applikation gering halten.

vielen Dank
Florian

marabu 30. Jul 2006 10:56

Re: Delphi Win32 Applikation schneller machen
 
Hi,

in einer länger laufenden Schleife sollte sich dein Prgramm etwas kooperativer zeigen und ab und zu mit Application.ProcessMessages die Kontrolle an die Nachrichtenschleife zurückgeben.

Nach dem Löschen einer Datei aus deiner Liste berechnset du für alle anderen 1000 Dateien wiederholt den Hash? Cool!

Grüße vom marabu

Christian Seehase 30. Jul 2006 11:56

Re: Delphi Win32 Applikation schneller machen
 
Moin Fabian,

ich kann zwar im Moment den Sinn Deiner Konstruktion nicht nachvollziehen, man kann sie auch nur mit for-Schleifen machen:

Delphi-Quellcode:
  for iOuter := 0 to slFiles.Count-1 do begin
    for iInner := iOuter+1 to slFiles.Count-1 do begin
    end;
  end;

Michael Habbe 30. Jul 2006 12:40

Re: Delphi Win32 Applikation schneller machen
 
Zitat:

Zitat von NeoXan
Hallo,

ich habe folgendes "Problem". Zu erst durchsuche ich diverse Verzeichnisse rekursiv und baue mir eine Liste aus den Dateien vom Typ TStringlist. Dann gehe ich wie folgt diese Liste durch:

Delphi-Quellcode:
cFile vom Typ String
while( slFiles.Count > 0 ) do
begin
 cFile := slFiles[0];
 slFiles.Delete(0);
 for i:=0 to slFiles.Count-1 do
  { Hier wird der Hash der Datei bei slFiles[i] berechnet }
end;
Wie könnte ich die Auslastung der Applikation gering halten.

Beim Durchlaufen der Festplatte und beim Hinzufügen der Dateien solltest Du mit der Methode "AddObject" gleich den Hash der Datei mit in die StringList schreiben. So brauchst Du die Liste nur einmal durchgehen, und kannst anschließend nicht mehr vorhandene Dateien rausnehmen ohne erneut den Hash zu berechnen.

NeoXan 30. Jul 2006 12:55

Re: Delphi Win32 Applikation schneller machen
 
Zitat:

Zitat von Christian Seehase
man kann sie auch nur mit for-Schleifen machen:

ähm...nein, siehe slFiles.Delete(0);
Mit for Schleifen würde er versuchen auf Elemente zuzugreifen, welche nicht mehr existieren.

Zitat:

Nach dem Löschen einer Datei aus deiner Liste berechnset du für alle anderen 1000 Dateien wiederholt den Hash?
...stimmt *gleich ran mach*

Das mit Application.ProcessMessages habe ich schon, der gepostete Quelltext ist lediglich ein Ausschnitt mit den relevanten Zeilen.

Wenn ich jetzt den Hash z.B. vorberechne, dann dauert halt das Einlesen der Dateinamen nebst Hash etwas länger, dafür aber nur einmal, okay! Aber mich würde interessieren, ob man nicht irgendwie die Auslastung der Applikation gering halten kann, natürlich nicht bei gleicher Geschwindigkeit. Also sprich, sie läuft etwas langsamer, verbraucht dafür aber weniger Prozessorleistung.

vielen Dank
Florian

Ralf Kaiser 30. Jul 2006 13:05

Re: Delphi Win32 Applikation schneller machen
 
Zitat:

Zitat von NeoXan
Zitat:

Zitat von Christian Seehase
man kann sie auch nur mit for-Schleifen machen:

ähm...nein, siehe slFiles.Delete(0);
Mit for Schleifen würde er versuchen auf Elemente zuzugreifen, welche nicht mehr existieren.

Beim Löschen aus einer LIste mit FOR-Schleife lass die Schleife einfach rückwärts laufen.

Delphi-Quellcode:
for i := Liste.Count - 1 downto 0 do begin
  if Bedingung then Delete(i);
end;
Dann kann so etwas nicht mehr passieren.

Ralf

ste_ett 30. Jul 2006 13:07

Re: Delphi Win32 Applikation schneller machen
 
Zitat:

Zitat von NeoXan
Aber mich würde interessieren, ob man nicht irgendwie die Auslastung der Applikation gering halten kann, natürlich nicht bei gleicher Geschwindigkeit. Also sprich, sie läuft etwas langsamer, verbraucht dafür aber weniger Prozessorleistung.

vielen Dank
Florian

Eine Möglichkeit wäre ein
Delphi-Quellcode:
Sleep(x);
bei jedem n-ten Durchlauf/jedem neuen Ordner/etc.

Michael Habbe 30. Jul 2006 13:08

Re: Delphi Win32 Applikation schneller machen
 
Zitat:

Zitat von NeoXan
Aber mich würde interessieren, ob man nicht irgendwie die Auslastung der Applikation gering halten kann, natürlich nicht bei gleicher Geschwindigkeit. Also sprich, sie läuft etwas langsamer, verbraucht dafür aber weniger Prozessorleistung.

Nun, bei niedriger Priorität nimmt es sich die CPU-Zeit, die zur Verfügung steht, also quasi die "Leerlaufzeit". Wenn ein Programm die CPU braucht, bekommt Dein Programm halt weniger zugeordnet. Und die Auslastung ist eigentlich nur ein Hinweis darauf, ob Dein Programm zu anspruchsvoll für die CPU ist, oder die CPU Dein Programm locker wegstecken kann. Da fließen natürlich auch noch so Dinge wie RAM- und Festplattengeschwindigkeiten usw. ein. Wenn Dein Programm viel auf der HD wühlt, könnte sich die CPU evtl. "langweilen".

edit:
@st_ett

"sleep" hält das ganze Programm für die Zeitspanne an. D. h. da tut sich dann gar nichts und die Programmlaufzeit verlängert sich entsprechend.

Christian Seehase 30. Jul 2006 13:15

Re: Delphi Win32 Applikation schneller machen
 
Moin Florian,

Zitat:

Zitat von NeoXan
ähm...nein, siehe slFiles.Delete(0);
Mit for Schleifen würde er versuchen auf Elemente zuzugreifen, welche nicht mehr existieren.

dann schau Dir bitte noch einmal die Schleifenkonstruktion an.
Der Startwert der inneren Schleife wird ja immer so gesetzt, dass das erste Element übergangen wird.
Damit spare ich das Löschen ein, und die innere Schleife läuft trotzdem so wie Du es machst.

JayBee 30. Jul 2006 13:26

Re: Delphi Win32 Applikation schneller machen
 
Um die CPU-Auslastung deines Programms zu verringern musst du einfach ein anderes Programm starten, welches den Prozessor beansprucht. Dann bekommt dein Programm automatisch weniger "Leistung" zugeteilt. Anders ist das Verringern imho nicht möglich (Wäre ja auch unsinnig - dann "verpufft" Prozessorleistung, obwohl dein Prozess sie gebrauchen könnte).


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 Uhr.
Seite 1 von 2  1 2      

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