Wie lange dauert die thread-Erstellung und Terminierung unter Windows?
Habe ich gesplittet, eine komplexe array-Verarbeitung Aufgabe in eine Anzahl von threads, um die Vorteile von multi-core-Prozessoren und sehe große Vorteile. Derzeit, zu Beginn die Aufgabe, die ich erstellen des threads, und dann warten, für Sie zu beenden, wie Sie Ihre Arbeit abschließen können. Ich bin in der Regel erstellen etwa vier mal die Anzahl der threads wie Prozessorkerne zur Verfügung stehen, wie jedem thread Haftung zu nehmen, eine unterschiedliche Menge an Zeit, und mit extra threads wird sichergestellt, dass alle Kerne sind besetzt gehalten die meisten der Zeit. Ich Frage mich, wäre es viel von einem performance-Vorteil für die Erstellung des threads, da das Programm feuert up, halten Sie Sie im Leerlauf, bis Sie benötigt, und Sie als ich mit der Verarbeitung beginnen. Einfacher ausgedrückt, wie lange dauert es, um start-und Ende-ein neuer thread über die Verarbeitung in den thread? Ich bin aktuell beginnen die threads mit
CWinThread *pMyThread = AfxBeginThread(CMyThreadFunc,&MyData,THREAD_PRIORITY_NORMAL);
In der Regel werde ich mit 32 threads auf 8 Kerne auf einem 64-bit-Architektur. Der Prozess in Frage, aktuell nimmt < 1 Sekunde, und befeuert wird jedes mal, wenn die Anzeige aktualisiert wird. Wenn sich der Start und das beenden eines thread < 1ms, die Rückkehr rechtfertigen nicht den Aufwand. Ich bin einige Probleme mit der Profilierung dieser.
Einen Verwandte Frage hier hilft, aber ist ein bisschen vage für das, was ich bin nach. Jedes feedback dankbar.
- Display-refresh-klingt wie ein häufiges Ereignis, es wäre definitiv ein Vorteil bei der Zusammenlegung von threads und halten Sie Sie im Leerlauf, für eine weitere Wiederverwendung. Thread-Erstellung von overhead ist vielleicht nicht etwas zu schwer, aber trotzdem ist die Synchronisation Kosten, es ist virtueller Speicher-Fußabdruck usw.
- Nicht eine Antwort, die aber mit 32 threads auf 8 Kerne nicht eine gute Lösung, wenn Ihre Aufgabe ist die CPU gebunden. Könnten Sie besser dran, indem eine Zahl, die näher an die Zahl der tatsächlichen hardware-threads, die Sie verwenden können. Ich würde empfehlen die Erstellung eines thread-pool im Voraus, egal, wie viel es braucht, um Sie zu erstellen, möchten Sie vielleicht, um Sie wiederzuverwenden 🙂
- Ich habe experimentierte mit unterschiedlicher Anzahl von threads, und fand mehr threads als die maximale Parallelität funktioniert am besten in diesem Zusammenhang. Der Grund dafür ist, dass die insgesamt verstrichene Zeit basierend auf, wenn der Letzte thread beendet, und jeder thread hat ein anderes Arbeitspensum, das ist schwer im Vorhinein abzuschätzen. Wenn ich einen thread mit deutlich mehr Arbeit als die anderen, dies verlangsamt den gesamten Prozess mit einem thread nur pro Kern, als die Kerne, haben mit Ihren arbeiten fertig sind untätig.
- auf die Messung und das Verständnis des Verhaltens.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schrieb ich hier schon eine ganze Weile her, als ich hatte das gleiche grundlegende Frage (zusammen mit anderen, die gleich offensichtlich werden). Ich habe aktualisiert es zu zeigen, ein wenig mehr über nicht nur, wie lange es dauert, threads zu erstellen, aber wie lange dauert es, bis die threads starten, ausführen:
Beispiel-Ergebnisse:
Den ersten paar thread starten, mal schauen wie diese:
Beachten Sie, dass obwohl diese passieren, um monoton steigende, das ist nicht garantiert (obwohl es ist definitiv ein trend in diese Allgemeine Richtung).
Als ich das erste schrieb, die Einheiten, die ich verwendet, mehr Sinn-auf einem 33 MHz 486, diese Ergebnisse waren nicht kleine Fraktionen wie diese. 🙂 Ich nehme an, eines Tages, wenn ich das Gefühl ehrgeizig, sollte ich diese umschreiben zu verwenden
std::async
zum erstellen der threads undstd::chrono
zu tun, das timing, aber...Einige Hinweise:
War ich neugierig auf die moderne Windows-Taskplaner, so schrieb ich ein weiteres test-app. Ich habe mein bestes versucht bei der Messung der thread halt mal durch Optional spinning bis ein thread beobachten.
Quelle: