Frage

Ich habe zeitkritischen Stück Code in meiner Anwendung. Ich habe den Faden, der es höchste Priorität läuft -., Die die meisten, was ich tun könnte

Gibt es irgendwelche Vorschläge, wie ein Teil des Codes läuft in diesem Thread zu machen, wie wenig wie möglich unterbrochen werden (weniger Kontextwechsel aufgetreten ist)?

Der Code ist nicht kompliziert. Ich ersetzen alle Methodenaufrufe mit inlined Code und ich etwas von hohem Niveau nicht (wie kein LINQ) verwenden. Die meisten Operationen sind Arithmetik. Es gibt nur einen Vergleich von Zeichenketten (ich denke an Möglichkeiten, wie davon zu befreien). Die Hälfte der Mathematik ist mit ints und die Hälfte mit Doppelzimmern.

Der Code ist x86 .NET 4 C #. Läuft auf Single Xenon X3450 W2008R2. Einzel App-Server.

(Leider Daten aus 3D-Party-API kommen, die nicht x64 unterstützt (hasst es!))

Ich würde schätzen Diskussion mit erfahrenen Entwicklern erwachsen.

P. S. Der Server hat keine Auslagerungsdatei so schwer Seitenfehler entweder passieren würden nicht (keine unerwünschten IO-Operationen).

War es hilfreich?

Lösung

Das einzige, was Sie in Bezug auf den Kontextwechsel zu sorgen müssen, blockiert den Thread. So sollte es kein Problem mit der Verwendung von LINQ (das heißt, LINQ-to-Objekte, offensichtlich LINQ to SQL oder was auch immer würde bedeuten, blockiert!). Jede Art von arithmetischen oder dem Aufrufen von Methoden und so weiter wird auch nicht den Faden blockiert und hat so keinen Einfluss auf Kontextwechsel.

Die andere Sache, die Kontextwechsel beeinflusst, ist, wie Sie erwähnt, Priorität. Aber nicht nur Priorität Thread, auch Priorität Ihres Prozesses. Sie können SetPriorityClass Erhöhung Ihr Prozess Priorität zu ABOVE_NORMAL_PRIORITY_CLASS (ich würde es höher als die sich nicht die Mühe setzen) und dann Priorität Ihre Threads auf Above normal als auch.

jedoch im allgemeinen Prioritäten sind wirklich nur dann sinnvoll, wenn es darum geht, von Timing (das heißt, sicherstellen, dass Ihr Prozess reagiert auf externen Eingang (Netzwerk, Benutzereingabe, Disk-I / O) als schnell wie möglich). Es wird tatsächlich nur sehr wenig Einfluss auf Ihren Threads tatsächlichen Durchsatz, wenn Sie andere Prozesse, die auch CPU-gebunden zugleich ausgeführt werden. Aber wenn das der Fall ist, dann mit Prioritäten Hantieren wird nicht ohnehin eine langfristig tragfähige Lösung. Dies liegt daran, finden Sie, dass durch einen der Prozesse auf eine höhere Priorität einstellen, wird es vollständig die anderen Prozesse verhungern und sie werden nie ausgeführt werden.

Wie auch immer, würde ich vorsichtig Dinge beachten, bevor Prioritäten Thread und Prozess anpassen. Und, wie immer, Test, Test, Test!

Andere Tipps

Wenn Sie diese nicht verwalteten WINAPI Code stattdessen machen, die SetThreadPriority Funktion unterstützt auch eine THREAD_PRIORITY_TIME_CRITICAL (höher als THREAD_PRIORITY_HIGHEST).

Es lohnt sich auch die Priorität des Prozesses steigern, in dem der Thread ausgeführt wird (tatsächliche Priorität hängt von einer Kombination aus Faden und Prozesspriorität).

Sie sollten auch vermeiden, E / A-Anrufe auf dem Faden zu machen (die blockieren könnten). Wobei es zu einer vielleicht-lächerlich extreme Sie auch I / O-Anrufe auf andere Threads vermeiden könnte zu machen (die vorübergehend die Priorität dieser Threads erhöhen könnte).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top