Wenn bei der Berechnung jedes Datensatzes ca. 1 Sekunde benötigt wird, dann braucht man im Idealfall
Anzahl | Cores | Dauer (h) |
---|
1.000.000 | 1 | 277,77 |
1.000.000 | 6 | 46,30 |
Dies ist aber jetzt die reine Berechnungszeit und erfodert die volle Aufmerksamkeit eines jeden Cores. Hat man 4 Cores, dann nützen einem 6 Threads hier nichts ... sie sind eher schädlich.
Bei der Menge der Datensätze und dem Thread-Aufbau (Daten lesen, Berechnen, Daten schreiben) spielen die Zeiten für Lesen/Schreiben auch eine Rolle und addieren sich hinzu. Eine CriticalSection sorgt auch noch dafür, dass die Threads sich untereinander ausbremsen.
Darum nimmt man dafür eine Pipeline.
- Die erste Stage holt die Datensätze und schiebt diese in eine Queue A
- Die zweite Stage holt einen Datensatz aus der Queue A, führt die Berechnung aus und gibt das Ergebnis in eine Queue B
- Die dritte Stage holt einen Datensatz aus der Queue B und schreibt den Datensatz wieder zurück
Mit diesem Aufbau kommt man ziemlich nahe an den Idealfall von
Anzahl * Berechnungszeit / Cores, denn die gegenseitige Behinderung ist nur beim Zugriff auf die Queues A/B gegeben und die sind extrem kurz.