![]() |
AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?
Zitat:
D.h. für viele Fälle sollte man nicht mehr nehmen, es kann aber auch im Einzelfall schon bei weniger Threads zu Verlangsamung kommen. Mann sollte es mit dem Eigenen Anwendungsfall testen. |
AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?
Ich höre öfter mal 1-1,5 mal Anzahl Kerne als Grenzwert, das hängt aber sicher von der Aufgabe und dem System ab.
Das Optimum ist da nur heuristisch zu ermitteln. Für jede Datei einen Thread zu Erstellen ist aber höchstwahrscheinlich der falsche Weg. Anstelle von der Anzahl der Ressourcen (Kerne, evtl. Platten/Partitionen), welche die "ideale" Anzahl von Threads bestimmen, lässt du die Anzahl der Aufgaben diese Entscheidung treffen, die damit nichts zu tun hat und vermutlich auch noch vom arglosen User vorgegeben wird. Zu viele Threads kosten Zeit für die Erstellung (wenn du keinen Pool benutzt), Zeit für die Threadwechsel und nicht zu vergessen: das Dateisystem (und das Gesamtsystem allgemein) wird auch nicht gerade effizienter, je mehr Threads darauf herumhacken. |
AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?
Gibt es einen Weg die Dauer des gesamten Vorgangs zu messen ?
Delphi-Quellcode:
Der Wert der hier raus kommt deckt sich ja nicht mit der Gesamtdauer, da die Threads ja unabhängig laufen oder ?
procedure TForm1.Button8Click(Sender: TObject);
var DateienLst: TSearchRec; Thread1: TMyThread1; //Zeittest freq: Int64; startTime: Int64; endTime: Int64; begin QueryPerformanceFrequency(freq); QueryPerformanceCounter(startTime); if FindFirst(Directory + '*.txt', faAnyFile and not faDirectory, DateienLst) = 0 then try repeat Thread1:= TMyThread1.Create(True); Thread1.FreeOnTerminate := True; Thread1.FDateienname:= Directory+DateienLst.Name; Thread1.Resume; until FindNext(DateienLst) <> 0; finally SysUtils.FindClose(DateienLst); end; QueryPerformanceCounter(endTime); ShowMessage('Die Routine benötigte etwa ' + IntToStr((endTime - startTime) * 1000 div freq) + 'ms'); end; |
AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?
Zitat:
PS: Üblicherweise reserviert Windows glaube ich eine Stack-Größe von ca 1MB pro Thread. Wenn du jetzt 100 Threads aufmachst, kostet dich das natürlich auch 100 Megabyte und mehr. Nicht, dass das heute noch jemanden stören würde, aber vor ein paar Jahren hat man das sicherlich gemerkt, wenn man mal eben 200 Threads aufgemacht hat... |
AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?
Zitat:
Hast du alle diese Threads untersucht, ob diese auch aktiv sind? :roll: Zitat:
![]() ![]() |
AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?
Zitat:
|
AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?
Zitat:
|
AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?
Ok danke das werde ich mal versuchen.
|
AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?
für was eigentlich threads?
Starte halt deine Prozesse ohne poWaitOnExit und prüfe später ab,ob sie beendend sind. ![]() ![]() |
AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?
So hat sich doch gelohnt, also vorher waren es ca. 27sek jetzt sind es ca. 15sek. Also fast doppelt so schnell und beide Kerne sind bei voller Last für die Zeit.
Den Zeittest habe ich so gemacht:
Delphi-Quellcode:
Um die Threads zu beschränken habe ich hier diese nützliche Unit mal benutzt (
[...]
private { private declarations } procedure CountDown(Sender: TObject); public { public declarations } end; [...] { TForm1 } var GThreadCount: Integer = 0; Gfreq: Int64; GstartTime: Int64; GendTime: Int64; procedure TForm1.CountDown(Sender: TObject); //Aktion am Ende eines Threads begin Dec(GThreadCount); if ThreadCount = 0 then begin QueryPerformanceCounter(GendTime); ShowMessage('Die Routine benötigte etwa ' + IntToStr((GendTime - GstartTime) * 1000 div Gfreq) + 'ms'); end; end; procedure TForm1.Button1Click(Sender: TObject); var DateienLst: TSearchRec; Thread1: TMyThread1; begin QueryPerformanceFrequency(Gfreq); QueryPerformanceCounter(GstartTime); GThreadCount:= 0; if FindFirst(Directory + '*.txt', faAnyFile and not faDirectory, DateienLst) = 0 then try repeat Inc(GThreadCount); Thread1:= TMyThread1.Create(True); Thread1.FreeOnTerminate := True; Thread1.FDateienname:= Directory+DateienLst.Name; Thread1.OnTerminate:= @CountDown;// Prozedur die beim beenden des Threads ausgeführt wird Thread1.Resume; until FindNext(DateienLst) <> 0; finally SysUtils.FindClose(DateienLst); end; end; ![]() @creed steiger Danke für den Hinweis, ich weiß aber nicht wo ich den ExitStatus abfragen soll damit ich ihn für den Zeittest benutzen kann und kann man die Anzahl auch irgenwie begrenzen der Prozesse, ohne alzu großen Aufwand? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 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