2009-08-04 13 views
1

Environment: Win32, C/C++Was ist schneller: SetEvent, Sendmessage, Postmessage

Alle drei (3) für einen Thread benutzt werden, um Haupt zu signalisieren(), dass es eine Operation zum Beispiel vollendet hat.

Aber welches ist das schnellste Signal von allen?

hmm ...

+0

Meinst du die win32-methoden? Auch welche Sprache? –

+1

Sie machen verschiedene Dinge. –

+12

Was kocht Wasser schneller: Ein Kessel, ein Haushaltskessel oder ein Autokühler? Antwort: Es ist egal, weil sie alle Wasser für verschiedene Zwecke kochen. Verwenden Sie die richtige für den Umstand. –

Antwort

6

Alle drei Optionen erfordern einen Threadkontextschalter, um den empfangenden Thread tatsächlich zu signalisieren. Es ist ziemlich wahrscheinlich, dass der Overhead des Kontextwechsels jeden Unterschied in den Verarbeitungskosten in einer der APIs überfordern wird.

Die Wahl wird wahrscheinlich am besten durch die Art des Empfangsfadens, z.B. ist es ein UI-Thread und/oder führt er eine Nachrichtenschleife aus. Das heißt, einige feine Details enthält:

  • SendMessage nützlich ist, wenn das Aufnahmegewinde eine UI-Thread ist, in einem Nachrichtenschleife Buttern. Der sendende Thread wird blockiert, bis der Empfänger die Nachricht verarbeitet. Es kann jedoch während dieser Zeit nicht abgefangene Nachrichten verarbeiten. Diese Logik könnte möglicherweise die Vorgänge verlangsamen, da zusätzliche Kontextwechsel beteiligt sein könnten, was SendMessage zum langsamsten der drei macht.

  • PostMessage ist auch nützlich, wenn der Empfänger in einer Nachrichtenschleife ist. Der Unterschied zu SendMessage besteht darin, dass nicht darauf gewartet wird, dass der Empfänger die Nachricht verarbeitet, wodurch weniger Overhead entsteht.

  • SetEvent ist nützlich, wenn der empfangende Thread auf ein Ereignisobjekt warten kann, z. mit WaitForSingleObject(). Es verursacht keinen Marshalling- oder Nachrichtenverarbeitungsaufwand und reagiert wahrscheinlich schneller als die anderen.

0

nicht Haben Sie überprüft aber (vorausgesetzt, Sie jemanden für das Objekt wartet) Ich würde sagen, SetEvent, Sendmessage und schließlich Postmessage.

Bearbeiten: Der Grund für das oben genannte ist einfach, dass SendMessage synchron ist und PostMessage asynchron ist. Ich bin mir über das SetEvent nicht sicher, aber ich würde annehmen, dass es etwas auslöst, das auf das Ereignis wartet, ohne auf die Nachrichtenpumpe warten zu müssen, die die Nachricht liefert. Das Nachsenden oder Absenden ist wahrscheinlich egal, es kommt nur darauf an, ob die sendende Partei wartet oder nicht. Die interne Verarbeitung ist wahrscheinlich identisch.

Allerdings wird normalerweise weder das Senden noch das Senden einer Nachricht zum Senden eines Signals an einen anderen Thread verwendet.

2

SetEvent ist mit Abstand die schnellste und einfachste, aber es kann auch die wenigsten Informationen enthalten. Grundsätzlich kann es nur sagen, dass etwas passiert ist (das Ereignis wurde signalisiert) nichts mehr.

0

Wenn Sie bei MsgWaitForMultipleObjects vs WaitForMultipleObjects betrachten, werden Sie sehen, dass die maximale Warte Objekte für MsgWaitForMultipleObjects ist weniger als WaitForMultipleObjects was bedeutet, dass es eine versteckte „auf Nachrichtenereignis“, so wird eine Meldung haben den Aufwand für eine ereignis + die übergabe der nachricht

+0

Das ist eine interessante Beobachtung, aber es bedeutet nicht notwendigerweise, dass Nachrichten über Ereignissen implementiert werden oder mehr Overhead als Ereignisse haben. 'WaitForMultipleObjects()' kann auf andere Objekttypen (Threads, Prozesse, Mutexe, Timer usw.) warten. Sie können einen Debugger verwenden, um zu sehen, dass 'WaitForMultipleObjectsEx()' und 'MsgWaitForMultipleObjectsEx()' verschiedene NT Native API-Einstiegspunkte aufrufen (zumindest unter Vista). – bk1e