AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Kein wirklicher Geschwindigkeitsvorteil durch Threads?
Thema durchsuchen
Ansicht
Themen-Optionen

Kein wirklicher Geschwindigkeitsvorteil durch Threads?

Ein Thema von Ginko · begonnen am 9. Mai 2013 · letzter Beitrag vom 12. Mai 2013
Antwort Antwort
Seite 4 von 5   « Erste     234 5      
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#31

AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?

  Alt 10. Mai 2013, 13:33
" Auf einem Ein-Prozessor-System stellen 16 aktive Threads die praktikable Obergrenze dar. "
Das wichtigest Wort ist wohl praktikable.
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#32

AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?

  Alt 10. Mai 2013, 13:48
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.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#33

AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?

  Alt 10. Mai 2013, 13:50
Gibt es einen Weg die Dauer des gesamten Vorgangs zu messen ?
Delphi-Quellcode:
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;
Der Wert der hier raus kommt deckt sich ja nicht mit der Gesamtdauer, da die Threads ja unabhängig laufen oder ?

Geändert von Ginko (10. Mai 2013 um 13:53 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#34

AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?

  Alt 10. Mai 2013, 13:57
" Auf einem Ein-Prozessor-System stellen 16 aktive Threads die praktikable Obergrenze dar. "
Wohlgemerkt "Ein-Prozessor-System", nicht "Ein-Kern-CPU" - Der Text ist mit Sicherheit 10, 15 Jahre alt. Schau doch mal in deinen Taskmanager, wieviele Threads da manche Prozesse haben. Und ist nicht auch das RAD Studio in Delphi geschrieben? Das Teil hat auch deutlich mehr als 16 Threads. Diese Schlingel.

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...

Geändert von Der schöne Günther (10. Mai 2013 um 14:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#35

AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?

  Alt 10. Mai 2013, 14:50
"Auf einem Ein-Prozessor-System stellen 16 aktive Threads die praktikable Obergrenze dar. "
Wohlgemerkt "Ein-Prozessor-System", nicht "Ein-Kern-CPU" - Der Text ist mit Sicherheit 10, 15 Jahre alt. Schau doch mal in deinen Taskmanager, wieviele Threads da manche Prozesse haben. Und ist nicht auch das RAD Studio in Delphi geschrieben? Das Teil hat auch deutlich mehr als 16 Threads. Diese Schlingel.
Warum sollten das "Schlingel" sein?

Hast du alle diese Threads untersucht, ob diese auch aktiv sind?

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...
Dazu gibt es einen sehr guten (englischen) Beitrag
Of Threads, Stacks and RAM – Part 1
Of Threads, Stacks and RAM – Part 2
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#36

AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?

  Alt 10. Mai 2013, 14:55
Der Wert der hier raus kommt deckt sich ja nicht mit der Gesamtdauer, da die Threads ja unabhängig laufen oder ?
Der Wert, der da rauskommt ist mal gerade die Zeit für das Erstellen der Dateiliste und das Erzeugen und Starten der Threads. Die Laufzeit der Threads kommt da überhaupt nicht zu tragen. Dazu müsstest du auf das Beenden aller Threads warten.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#37

AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?

  Alt 10. Mai 2013, 15:04
Der Wert der hier raus kommt deckt sich ja nicht mit der Gesamtdauer, da die Threads ja unabhängig laufen oder ?
Zähle mit wie viele Threads du erstellt hast und weise diesen beim Erstellen ein OnTerminate zu. In diesem Event OnTerminate zählst du dann wieder runter. Wenn du da bei 0 ankommst, wurden alle beendet und du kannst das dem Benutzer melden bzw. deine Zeitmessung beenden.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#38

AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?

  Alt 10. Mai 2013, 15:06
Ok danke das werde ich mal versuchen.
  Mit Zitat antworten Zitat
creed steiger

Registriert seit: 2. Dez 2009
116 Beiträge
 
#39

AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?

  Alt 11. Mai 2013, 13:13
für was eigentlich threads?

Starte halt deine Prozesse ohne poWaitOnExit und prüfe später ab,ob sie beendend sind.

http://lazarus-ccr.sourceforge.net/d.../tprocess.html

http://lazarus-ccr.sourceforge.net/d...s.options.html
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#40

AW: Kein wirklicher Geschwindigkeitsvorteil durch Threads?

  Alt 11. Mai 2013, 20:07
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:
[...]
 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;
Um die Threads zu beschränken habe ich hier diese nützliche Unit mal benutzt (http://www.delphipraxis.net/93835-wo...tml#post637044), da habe ich aber noch keinen Zeittest hinbekommen.
@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?

Geändert von Ginko (11. Mai 2013 um 20:46 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


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 06:55 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