2012-04-14 6 views
0

Meine Multithread-Anwendung nehmen einige Dateien von der HD und verarbeiten dann die Daten in diesen Dateien. Ich benutze die gleiche Instanz einer Klasse (dataProcessing), um Threads zu erstellen (ich ändere nur die Parameter der aufrufenden Methode).Multithread-Anwendung erreicht nicht 100% der Prozessorauslastung

processingThread [i] = neuer Thread (neuer ThreadStart (dataProcessing.parseAll));

Ich frage mich, ob die Ursache alle Threads aus dem gleichen Speicher gelesen werden könnten.

Es dauert etwa eine halbe Minute, um jede Datei zu verarbeiten. Die Dateien werden schnell gelesen, da sie nur 200 KB groß sind. Nachdem ich die Dateien verarbeitet habe, schreibe ich alle Ergebnisse in eine einzige Zieldatei. Ich denke nicht, dass das Problem Lesen oder Schreiben auf die Festplatte ist. Alle Threads arbeiten an der Aufgabe, aber aus irgendeinem Grund wird der Prozessor nicht vollständig verwendet. Ich versuche, mehr Threads hinzuzufügen, um zu sehen, ob ich 100% der Prozessorauslastung erreichen kann, aber es kommt zu einem Punkt, wo es die Verarbeitungsnutzung verlangsamt und verringert, anstatt sie vollständig zu nutzen. Jeder hat eine Idee, was könnte falsch sein?

+0

Was ist mit diesem Prozess Sie glauben, dass die Engpässe CPU sind? – yamen

+0

Nun, wenn ich die Anwendung debuggte, sehe ich, dass alle Threads "etwas tun". In der Tat, ich habe etwas Zeit mit mehr Threads, aber wenn ich zu viele hinzufügen, sinkt die Leistung. – Devela

+0

Ich denke, dass mehr Informationen benötigt werden. Alle diese Aufgaben werden in die gleiche Datei zurückgeschrieben, was den Flaschenhals darstellen könnte. 30 Sekunden, um 200KB Daten zu verarbeiten, schlagen etwas anderes als CPU-gebundene Prozesse vor ... – yamen

Antwort

0

Hier einige Punkte, die Sie vielleicht prüfen:

  1. meisten CPUs sind heute Hyper fädelt. Obwohl das Betriebssystem annimmt, dass jeder Hyper Threaded-Kern über zwei Pipelines verfügt, ist dies nicht der Fall und hängt stark von der CPU und den arithmetischen Operationen ab, die Sie ausführen. Während auf den meisten CPUs 2 Integer-Einheiten auf jeder Pipeline vorhanden sind, gibt es nur eine FP, so dass die meisten FP-Operationen nicht von der Hyper-Threaded-Architektur profitieren.

  2. Da die Datei nur 200k ist, kann ich nur davon ausgehen, dass alles in den Cache kopiert wird, so dass dies kein Speicher/Datenträger Problem ist.

  3. Verwenden Sie externe DLLs? Einige Operationen, wie das Lesen/Speichern von JPEG-Dateien mit der nativen Bitmap-Klasse, sind nicht parallel und Sie werden keine Beschleunigung sehen, wenn Sie mehrere Ausführungen gleichzeitig ausführen.

  4. Die Leistung nimmt ab, wenn Sie einen Punkt erreichen, an dem das Wechseln zwischen den Threads mehr kostet als die Operation, die sie ausführen.

  5. Lesen Sie nur die Daten oder ändern Sie sie auch? Wenn jeder Thread auch die Daten ändert, gibt es viele Sperren für den Cache. Es wäre besser, wenn jeder Thread seine eigenen Daten in seinem eigenen Speicher sammelt und alle Daten erst zusammenführt, nachdem alle Threads ihre Arbeit getan haben.

+0

Die Operationen, die ich ausführe, sind keine arithmetischen Operationen. Ich habe darauf geachtet, dass es keinen Festplattenengpass gibt, da ich weniger Zeit brauche, um die Dateien zu öffnen, zu lesen und zu schließen. Ja, ich verwende eine externe DLL, aber ich habe mehrere Instanzen von HtmlAgilityPack HtmlDocument, eine für jeden Thread. Sie alle teilen jedoch eine Datenstruktur (nur für Lesevorgänge). – Devela

+0

Ich habe vergessen, Sie in der vorherigen Nachricht zu markieren, irgendwelche Ideen? – Devela

+0

Gibt es einen Punkt, an dem die Threads Sperren verwenden, z. B. beim Lesen der gemeinsamen Datenstruktur? – IvoTops

Verwandte Themen