![]() |
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:
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.
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. vielen Dank Florian |
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 |
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; |
Re: Delphi Win32 Applikation schneller machen
Zitat:
|
Re: Delphi Win32 Applikation schneller machen
Zitat:
Mit for Schleifen würde er versuchen auf Elemente zuzugreifen, welche nicht mehr existieren. Zitat:
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 |
Re: Delphi Win32 Applikation schneller machen
Zitat:
Delphi-Quellcode:
Dann kann so etwas nicht mehr passieren.
for i := Liste.Count - 1 downto 0 do begin
if Bedingung then Delete(i); end; Ralf |
Re: Delphi Win32 Applikation schneller machen
Zitat:
Delphi-Quellcode:
bei jedem n-ten Durchlauf/jedem neuen Ordner/etc.
Sleep(x);
|
Re: Delphi Win32 Applikation schneller machen
Zitat:
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. |
Re: Delphi Win32 Applikation schneller machen
Moin Florian,
Zitat:
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. |
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:14 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