AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Delphi Win32 Applikation schneller machen
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi Win32 Applikation schneller machen

Ein Thema von NeoXan · begonnen am 30. Jul 2006 · letzter Beitrag vom 30. Jul 2006
Antwort Antwort
Seite 1 von 2  1 2      
NeoXan
(Gast)

n/a Beiträge
 
#1

Delphi Win32 Applikation schneller machen

  Alt 30. Jul 2006, 10:41
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Delphi Win32 Applikation schneller machen

  Alt 30. Jul 2006, 10:56
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Delphi Win32 Applikation schneller machen

  Alt 30. Jul 2006, 11:56
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;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Michael Habbe
Michael Habbe

Registriert seit: 10. Aug 2005
264 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Delphi Win32 Applikation schneller machen

  Alt 30. Jul 2006, 12:40
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.
  Mit Zitat antworten Zitat
NeoXan
(Gast)

n/a Beiträge
 
#5

Re: Delphi Win32 Applikation schneller machen

  Alt 30. Jul 2006, 12:55
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
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: Delphi Win32 Applikation schneller machen

  Alt 30. Jul 2006, 13:05
Zitat von NeoXan:
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
Ralf Kaiser
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#7

Re: Delphi Win32 Applikation schneller machen

  Alt 30. Jul 2006, 13:07
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
Sleep(x); bei jedem n-ten Durchlauf/jedem neuen Ordner/etc.
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
Benutzerbild von Michael Habbe
Michael Habbe

Registriert seit: 10. Aug 2005
264 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Delphi Win32 Applikation schneller machen

  Alt 30. Jul 2006, 13:08
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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Delphi Win32 Applikation schneller machen

  Alt 30. Jul 2006, 13:15
Moin Florian,

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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
JayBee

Registriert seit: 20. Jul 2006
21 Beiträge
 
Delphi 5 Standard
 
#10

Re: Delphi Win32 Applikation schneller machen

  Alt 30. Jul 2006, 13:26
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).
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:44 Uhr.
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