While-Schleife auf allen Kernen nutzen



  • Hi,

    ist es möglich die folgende while-Schleife so umzubauen, dass die "maximale" CPU-Leistung ausgereizt werden kann? Wenn ja, was muss ich tun?

                    while (Worksheet.Cells[iZeile, "A"].Value != null)
                    {
                        ListViewItem Neue_Zeile = new ListViewItem(Convert.ToString(iZeile));
                        Neue_Zeile.SubItems.Add(Convert.ToString(Worksheet.Cells[iZeile, "A"].Value)); 
                        Neue_Zeile.SubItems.Add(Convert.ToString(Worksheet.Cells[iZeile, "B"].Value)); 
                        Neue_Zeile.SubItems.Add(Convert.ToString(Worksheet.Cells[iZeile, "C"].Value)); 
                        Neue_Zeile.SubItems.Add(Convert.ToString(Worksheet.Cells[iZeile, "D"].Value)); 
                        Neue_Zeile.SubItems.Add(Convert.ToString(Worksheet.Cells[iZeile, "E"].Value)); 
                        Neue_Zeile.SubItems.Add(Convert.ToString(Worksheet.Cells[iZeile, "F"].Value)); 
                        Neue_Zeile.SubItems.Add(Convert.ToString(Worksheet.Cells[iZeile, "G"].Value)); 
                        Neue_Zeile.SubItems.Add(Convert.ToString(Worksheet.Cells[iZeile, "H"].Value)); 
                        Neue_Zeile.SubItems.Add(Convert.ToString(Worksheet.Cells[iZeile, "J"].Value)); 
                        Neue_Zeile.SubItems.Add(Convert.ToString(Worksheet.Cells[iZeile, "L"].Value)); 
                        ListView_Liste.Items.Add(Neue_Zeile);                             
    
                        iZeile++;
                    }
    

    Besten Dank im Voraus?



  • Dafür gibt es die Task Parallel Library (TPL).
    Du müßtest die while-Schleife jedoch in eine for bzw. foreach umwandeln und dann Parallel.For bzw. Parallel.ForEachaufrufen.
    Da du die Daten jedoch in eine neue Liste überführen möchtest, mußt du dies wieder threadsicher synchronisieren (was auch wieder Rechenzeit kostet).



  • @Th69 sagte in While-Schleife auf allen Kernen nutzen:

    Da du die Daten jedoch in eine neue Liste überführen möchtest, mußt du dies wieder threadsicher synchronisieren (was auch wieder Rechenzeit kostet).

    Nicht nur das, man muss auch "partition-local variables" verwenden - zumindest wenn man es mit Parallel.ForEach machen möchte. Und das ist dann auch nicht so trivial.



  • Glaube ich nicht, sieht so aus als wenn du bestenfalls 100% Speicherbandbreite ausnutzen könntest. Hab aber nicht komplett verstanden, was das sein soll.


Log in to reply