Ich evaluiere verschiedene Interprozess-Kommunikationsmethoden für einige .NET 2.0 Prozesse, die sich auf demselben Rechner befinden . Natürlich ist .Net Remoting ein Kandidat, und theoretisch sollte die schnellste Konfiguration IpcChannel (Named Pipes) + BinaryFormatter sein.
Meine Benchmarks zeigen wirklich, dass Remoting über IpcChannel meist schneller sein kann als TcpChannel, aber IpcChannel zeigt einen steilen Abfall im Durchsatz, wenn Nachrichten größer werden (etwa 30 MB):
%Vor%Hat jemand eine Idee warum oder irgendeine Idee, wie man die Leistung beider Kanäle optimiert? Ich muss 30 MB BLOBs herumreichen und möchte vermeiden, dass ich mit Shared Memory / Memory-Mapped-Dateien umgehen muss. Außerdem kann ich mir nicht leisten, diese auf die Festplatte zu schreiben (viel langsamer).
Die folgende Methode wurde für die Benchmarks verwendet (wiederholt aufgerufen, gemessene Gesamtzeit, geteilte Gesamtanzahl Nutzlast nach Gesamtzeit).
%Vor% Eine Waffe, die kleiner ist als der geteilte Speicher, aber immer noch leistungsfähig genug für den Job, wäre Sockets. Lassen Sie bei der Ausführung der Remote-Prozedur einen Listen
ing-Socket auf einer festen oder Ad-hoc-Portnummer erstellen, stellen Sie eine Verbindung vom Client her her und verwenden Sie NetworkStream
, um Daten von einer Seite auf eine andere zu schreiben.
Es wird wie ein Zauber wirken, da bin ich mir sicher.
Dieser Artikel sollte Ihnen den Einstieg erleichtern.
Und obwohl Sie nichts über Server und Client auf separaten Rechnern erwähnen, haben Sie immer noch diese Fähigkeit, die verschwinden wird, wenn Sie Shared Memory verwenden.
Das "seltsame" Verhalten für große Nachrichtengrößen (30MB) beruht sicherlich auf GC-Druck. Übrigens sollte BinaryFormatter der langsamste aller möglichen Formatierer sein. DataContractFormatter könnte viel besser sein oder eine Handschrift wie diese Schönheit Ссылка sollte etwa 16 mal schneller sein. Wie hast du die Zeiten gemessen? War der Sende- und Empfangsprozess derselbe? Ich denke, 120 MB / s senden empfangen sind ziemlich gut für .net mit einem sehr beschäftigten Müllsammler. Sie sollten sich den% GC Time Performance-Zähler ansehen, um zu überprüfen, ob er hoch ist. Wenn es & gt; 95% sollten Sie den Speicher sparsamer nutzen. Andere Kommentatoren haben bereits darauf hingewiesen, dass Speicherkarten die richtige Wahl darstellen, wenn große Datenmengen zwischen Prozessen ausgetauscht werden müssen. Es gibt viele kostenlose Implementierungen wie
und
Ссылка (Smart Client Offline-Anwendung block hat eine dll, die a enthält nette Umsetzung).
Mit freundlichen Grüßen Alois Kraus
Tags und Links named-pipes ipc .net-2.0 remoting