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

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

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

  Alt 17. Mai 2017, 09: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)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

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

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

  Alt 17. Mai 2017, 10: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.052 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

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

  Alt 17. Mai 2017, 10: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
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 09:01 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