Die Faustregel für Threads lautet: Sie möchten, dass mindestens ein "aktiver" Worker-Thread für jede auf dem Computer verfügbare "Ausführungseinheit" auf dem Computer vorhanden ist (die Befehle können sofort ausgeführt werden, wenn die CPU-Zeit abgelaufen ist). Eine "Ausführungseinheit" ist ein logischer Befehlsprozessor, sodass ein Quad-Chip-Quad-Core-Xeon-Hyperthread-Server 32 EUs (4 Chips, 4 Kerne pro Chip, jeder Hyperthread) aufweist. Ihr durchschnittlicher Core i7 hätte 8.
Ein Thread pro EU nutzt die CPU-Leistung voll aus, vorausgesetzt, die Threads sind immer in Betrieb. Dies ist fast nie der Fall, da Threads Zugriff auf nicht zwischengespeicherten Speicher, die Festplatte, Netzwerkports usw. benötigen, auf die sie warten müssen, und für deren Ausführung keine aktive CPU-Aufmerksamkeit erforderlich ist. Auf diese Weise können Sie die Gesamteffizienz weiter steigern, wenn sich mehr Threads in der Warteschlange befinden und nur noch wenige verfügbar sind. Dies ist mit Kosten verbunden. Wenn eine CPU einen Thread wechselt, muss sie die Register, den Ausführungszeiger und andere Statusinformationen des Threads zwischenspeichern, die normalerweise im Innersten einer EU gespeichert sind und auf die sehr schnell zugegriffen werden kann, damit andere EUs in diesem CPU-Chip darauf zugreifen können. Es erfordert auch Threads im Betriebssystem, um zu entscheiden, zu welchem Thread gewechselt werden soll. Schließlich, wenn eine EU Themen wechselt, es verliert die Leistungsgewinne des Pipelining, das die meisten Prozessorarchitekturen verwenden; Es muss die Pipeline leeren, bevor Threads gewechselt werden. Aber da all dies im Durchschnitt immer noch viel weniger Zeit in Anspruch nimmt als nur darauf zu warten, dass die Festplatte oder sogar der Arbeitsspeicher mit Informationen versorgt wird, sind die Kosten wert.
Wenn Sie jedoch die doppelte Anzahl "aktiver" Threads als EUs überschreiten, verwendet das Betriebssystem im Allgemeinen mehr Zeitplanungs-Threads der EUs, und die EUs verbringen mehr Zeit mit dem Umschalten zwischen diesen Threads als mit dem Ausführen aktiver Threads von Programmen. Dies ist der Punkt von Größenunterschieden; Es dauert länger, bis ein Multithread-Algorithmus ausgeführt wird, wenn Sie an dieser Stelle einen zusätzlichen Thread hinzufügen.
Insgesamt möchten Sie also mindestens so viele Threads in Ihrem Programm beibehalten, wie EUs auf dem Computer vorhanden sind, aber Sie möchten vermeiden, dass mehr als die doppelte Anzahl an Threads vorhanden ist, die nicht warten oder schlafen.