Ich habe eine einfache Konsolenanwendung, die ZeroMQ verwendet, um Nachrichten zu senden und zu empfangen. In dem Abschnitt erhalten, ich habe die folgende Meldung Pumpe Code:.Funktioniert ZeroMQ Poll-Funktion übermäßige CPU auf .NET?
ZMQ.Context _context = new ZMQ.Context(1);
ZMQ.PollItem[] pollItems = new ZMQ.PollItem[0];
while (!_finished)
{
if (pollItems.Length > 0)
context.Poll(pollItems, pollTimeout);
else
Thread.Sleep(1);
if (_receiversChanged)
UpdatePollItems(ref pollItems);
}
(Die Idee ist, dass ich hinzufügen und Elemente aus dem Anfragenden zur Laufzeit entfernen können, wie ich Empfänger hinzufügen müssen UpdatePollItems einfach erstellt ein neues Array, wenn sich der Empfängersatz ändert.)
Ich habe pollTimeout-Werte von 50ms und 500ms probiert, aber die App (die auf ihrem Hauptthread auf Console.ReadKey sitzt) verwendet immer noch 100% eines Kerns, auch wenn nicht Nachrichten werden gesendet. Ich führte die App unter dem Profiler und bestätigte, dass es ZMQ.Context.Poller ist, der die ganze CPU kaut.
Haben andere ähnliches Verhalten gesehen? Ich verwende die neueste ZeroMQ C# -Bindung (clrzmq-x64.2.2.3 von NuGet).
Poll() verwendet wahrscheinlich busy wait, was unvermeidlich ist, wenn Sie eine niedrige Latenzzeit wünschen. – bongi
http://lists.zeromq.org/pipermail/zeromq-dev/2012-February/015734.html schlägt vor, dass mit der Java-Bindung CPU-Auslastung sollte ziemlich viel 0 sein. Es wäre eine Schande, wenn die .NET-Implementierung wasn wäre 't as good ... – SteveWilkinson