Einzelnen Beitrag anzeigen

a.def
(Gast)

n/a Beiträge
 
#10

AW: Generelle Fragen zu TParallel.For

  Alt 31. Dez 2016, 17:46
Ich habe deinen Rat befolgt.

Ich verwende nun 2x TTask.Run();
In jedem dieser rufe ich eine einzige bestimmte Funktion auf, welche durch meine StringListe geht (einige Parameter, zudem Start und Ende der For-Schleife)
Folgendermaßen berechne ich, welcher der beiden Runs was zu bearbeiten hat

Delphi-Quellcode:
run1 := 0;
run2 := 0;

// Beispiel: sl.Count = 5001
for i := 0 to (sl.Count div 2) - 1 do // 0 bis 2500
 Inc(run1);

for i := run1 to sl.Count - 1 do // 2501 bis 5000
 Inc(run2);

TTask.Run(
 procedure
  begin
   TThread.Queue(nil,
    procedure
     begin
      dummyFunction(param1, param2, ..., 0, run1);
     end);
  end);

TTask.Run(
 procedure
  begin
   TThread.Queue(nil,
    procedure
     begin
      dummyFunction(param1, param2, ..., run2, sl.Count - 1);
     end);
  end);
Wenn der zweite Aufruf von dummyFunction fertig bevor der erste fertigist, wartet der zweite Aufruf (Boolean Variable), bis der erste komplett.. komplett.. fertig ist.
Am ende des zweiten Aufrufs wird in dummyFunction() alles zusammengeführt (nur ein paar Zählervariablen).

Vorher brauchte das mit meinen Testdaten 2,1 bis 2,2 Sekunden im Schnitt. Nun bin ich bei 1,4 bis 1,5 im Schnitt.
Ich denke ich werde noch etwas einbauen, dass das TTask.Run nur bei Mehrkernsystemen verwendet wird.

Schöner wär's natürlich, wenn das alles super dynamisch wäre, ohne feste Variablen wie meine booleschen aktuell. Aber das kommt später wenn ich den Durchblick habe.

Geändert von a.def (31. Dez 2016 um 20:43 Uhr)
  Mit Zitat antworten Zitat