AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Gibt es von TParallel.for auch sowas wie TParallel.ForIn?
Thema durchsuchen
Ansicht
Themen-Optionen

Gibt es von TParallel.for auch sowas wie TParallel.ForIn?

Ein Thema von Mokus · begonnen am 17. Mai 2017 · letzter Beitrag vom 17. Mai 2017
Antwort Antwort
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Gibt es von TParallel.for auch sowas wie TParallel.ForIn?

  Alt 17. Mai 2017, 09:24
Delphi-Version: 10 Berlin
Wunderschönen guten Morgen,

die Frage steht eigentlich schon im Betreff,

kleine, vielleicht blöde frage, aber gibt es die Parralle For Schleife auch schon als For IN ?

wollte eigentlich diese 4 Zeilen Parallel machen ...


Code:
for MyElem in MyList do
begin
  myElem.TutDinge();
end;
oder muss es wirklich so sein
Code:
TParralel([...], procedure(i:integer)
begin
    List[i].TutDinge()
end; );
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Gibt es von TParallel.for auch sowas wie TParallel.ForIn?

  Alt 17. Mai 2017, 09:54
Ich habe noch nicht einmal geschaut, gehe aber davon aus dass es das nicht gibt. Wenn du etwas parallelisierst, geht es dir um Geschwindigkeit. Das for..in ist im Endeffekt nur Syntax-Zucker und kann nicht schneller sein. Wenn du z.B. durch einen Container von Records iterierst würde es mich nicht wundern wenn der Compiler jedes mal aktiv einen neue Kopie davon anlegt anstatt direkt darauf zu gehen.
  Mit Zitat antworten Zitat
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Gibt es von TParallel.for auch sowas wie TParallel.ForIn?

  Alt 17. Mai 2017, 10:02
nicht falsch verstehen,
ich habe nie erwartet dass for in schneller ist ...

mir geht es darum, ob es diesen "synatax zucker ( schönes wort ! ) auch in form der Paralelisierung schon exisitert.
Somit würde ich mir das extra merken des Objektes schließlich sparen.
Erhoffe mir dadurch nur lesbarkeit und Vereinfachung der Schreibarbeit.

Performance technisch macht das kein unterschied, das ist mir klar
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Gibt es von TParallel.for auch sowas wie TParallel.ForIn?

  Alt 17. Mai 2017, 10:44
Gibt es ein TParallel.For, was kein "i bis n" nimmt, sondern einen Enumerator oder wenigstens eine TList, bzw. ein Array?

Wenn ja, dann kannst du FOR-IN damit nutzen, denn das macht nicht anderes, als nachzugucken, ob es eine Methode DeineKlasse.GetEnumerator gibt und verwendet den.
(für dynamische Arrays in einer etwas obtimierteren Form, mit Index und ohne Enumerator)
$2B or not $2B
  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
 
#5

AW: Gibt es von TParallel.for auch sowas wie TParallel.ForIn?

  Alt 17. Mai 2017, 11:06
Das gibt es nicht und das hat auch seinen Grund: Das for..in verwendet einen Iterator, der explizit oder implizit von der zu iterierenden Menge geliefert wird. Iteratoren stellen ein MoveNext und ein GetCurrent zur Verfügung, das innerhalb der Schleife verwendet wird. Die meisten (wenn nicht sogar alle) Iteratoren verwenden einen internen State um diese Funktionalität zu implementieren. Das ist im einfachsten Fall der Index in einem Array, mit dem das GetCurrent realisiert wird und der beim MoveNext erhöht wird. Die Tatsache, daß man die Gesamtanzahl der Iterationen nicht im Voraus kennt, ist auch nicht gerade hilfreich.

Wollte man diese Iteration nun parallelisieren, würde das mit dieser Form des Iterators natürlich nicht gehen. Man müsste also erstmal eine Reihe von Iterationen (genauer Stride * ThreadCount) ausführen und die jeweiligen GetCurrent-Werte zwischenspeichern. Das kann je nach Anwendungsfall schon mal recht aufwändig werden. Das setzt allerdings voraus, daß sich diese Werte wirklich sauber zwischenspeichern lassen. Eine Iteration z.B. über ein DataSet, bei dem der aktuelle Datensatz in der Schleife verändert wird, fällt offensichtlich schon mal als Anwendungsfall heraus - von der fehlenden Multithread-Eignung eines TDataSet ganz zu schweigen.

Es ist schon schwierig genug, eine simple Schleife sauber zu parallelisieren. Kommt dann noch eine womöglich unbekannte Implementation eines Iterators dazu, würde ich vermutlich erstmal die Finger davon lassen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Gibt es von TParallel.for auch sowas wie TParallel.ForIn?

  Alt 17. Mai 2017, 11:07
Nein, gibt es nicht. Und wenn man sich mal durchliest, was es bei PLINQ alles zu beachten gibt, sieht man, dass das auch keineswegs trivial ist.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Gibt es von TParallel.for auch sowas wie TParallel.ForIn?

  Alt 17. Mai 2017, 11:09
Dann übergib doch einfach den For-Variable an eine TTask.
  Mit Zitat antworten Zitat
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Gibt es von TParallel.for auch sowas wie TParallel.ForIn?

  Alt 17. Mai 2017, 11:21
@Uwe Raabe
das ist mal eine ausführliche Antwort, leider hört die sich sogar sehr logisch an ...
Danke dafür !

Es ist nun bei der einfache For schleife, auf Grund von Problemen mit der Connection und die schon erwähnten Probleme mit TDataset ... geblieben ! :<

danke für alle antworten !
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:47 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