Frage

Ich war schlecht Auflackgut und erhielt einen Antrag, dass in bestimmten Situationen zumindest 100-mal zu langsam, was ich sehr bald zu unseren Kunden lösen (eine Frage von Wochen).

Durch einige sehr einfache Profilierung ich entdeckt habe, dass der Engpass ist die Verwendung von .NET Remoting zur Übertragung von Daten zwischen einem Windows-Dienst und der grafischen Front-End -. Sowohl läuft auf der gleichen Maschine

Microsoft-Richtlinien sagen "Minimize Rundfahrten und vermeiden gesprächig Schnittstellen" : Schreib

MyComponent.SaveCustomer("bob", "smith");

statt

MyComponent.Firstname = "bob";
MyComponent.LastName = "smith";
MyComponent.SaveCustomer();

Ich denke, dies ist die Wurzel des Problems in unserer Anwendung ist. Leider ruft MyComponent. * (Der Profiler zeigt, dass 99,999% der Zeit in solchen Aussagen ausgegeben wird) sind großzügig im gesamten Quellcode verstreut und ich sehe keine Hoffnung mit den Richtlinien über die Schnittstelle entsprechend neu zu gestalten.

Bearbeiten : In der Tat, die meiste Zeit die Front-End-Eigenschaften von MyComponent liest anstatt schreibt darauf. Aber ich vermute, dass MyComponent jederzeit in dem Back-End ändern kann.

Ich sah nach, ob ich alle Eigenschaften von MyComponent in einem Rutsch lesen kann und sie dann lokal zwischengespeichert werden (ohne Berücksichtigung der Wechsel-at-beliebige Zeit Ausgabe oben), aber das bedeuten würde Hunderte von Zeilen Code zu verändern.

Meine Frage ist: Sind sie irgendwelche ‚Quick-Win‘ Dinge, die ich versuchen kann, die Leistung zu verbessern

Ich brauche mindestens ein 100-facher Geschwindigkeit-up. Ich bin ein C / C ++ / Delphi Programmierer und bin ziemlich viel nicht vertraut mit C # /. NET / Remoting andere als das, was ich an der Tage in den letzten paar lesen, haben. Ich bin auf der Suche nach Dingen, die in wenigen Tagen abgeschlossen werden können -. Eine umfassende Umstrukturierung des Codes ist keine Option

Für den Anfang habe ich bereits bestätigt, dass es BinaryFormatter verwendet wird.

(Sorry, das ist wahrscheinlich eine schreckliche Frage nach dem Vorbild von ‚Wie kann ich fix X feasibly wenn ich all die möglichen Optionen ausschließen‘ ... aber ich bin verzweifelt!)

Edit 2 Als Antwort auf Richard Kommentar unten: Ich denke, meine Frage läuft darauf hinaus:

  1. Gibt es eine Einstellung, die ich ändern kann, die Kosten für ein .NET Remoting Round-Trip zu reduzieren, wenn beide Enden der Verbindung auf der gleichen Maschine sind?
  2. Gibt es eine Einstellung, die ich ändern kann, um die Anzahl der Umläufe zu reduzieren - so dass jeder Aufruf einer Remote-Objekteigenschaft resultiert nicht in einem separaten Round-Trip? Und könnte diese Pause etwas?
War es hilfreich?

Lösung

Unter .NET Remoting haben Sie 3 Möglichkeiten der Kommunikation von HTTP, TCP und IPC. Wenn die commnuicatin auf demselben PC ist sugest I IPC-Kanäle verwenden, wird es Ihre Anrufe beschleunigen.

Andere Tipps

Kurz gesagt, nein es gibt keine schnellen Gewinne hier. Persönlich würde ich nicht make MyComponent (als DTO) ein MarshalByRefObject (die vermutlich ist das Problem), da diese Rundreisen Sie lähmen werden. Ich würde es als eine reguläre Klasse halten, und nur ein paar wichtige Methoden bewegen sie herum zu pumpen (das heißt eine MarshalByRef Manager / Repository / etc Klasse).

Das sollte reduzieren Umläufe ; wenn Sie noch haben Probleme dann wird es wahrscheinlich sein, Bandbreite im Zusammenhang; dies ist leichter zu beheben; beispielsweise durch den Serializer zu ändern. protobuf-net können Sie dies einfach tun, indem Sie einfach ISerializable Umsetzung und Weiterleitung der beiden Methoden (einer von der Schnittstelle sowie die ctor) zu ProtoBuf.Serializer - dann macht die ganze Arbeit für Sie, und arbeitet mit Remoting. Ich kann wie wenn Sie Beispiele dafür liefern.

Eigentlich protobuf-Netz kann Hilfe bei der CPU-Auslastung zu, wie es ist ein viel CPU-effiziente Serializer.

Könnten Sie MyComponent eine Klasse zu machen, die die Werte zwischengespeichert werden und sie nur einreichen, wenn SaveCustomer () aufgerufen wird?

Sie können versuchen, Traffic zu komprimieren. Wenn dies nicht die 100-mal erhöhen, werden Sie noch einige Leistungsvorteile gewinnen

Wenn Sie die neuesten Daten benötigen (immer den realen Wert sehen), und die Kosten, die Daten zu bekommen jedes Mal dominiert die Laufzeit dann müssen Sie radikal sein.

Wie wäre es Polling Push ändern. Anstatt der Remote-Seite jedes Mal, rufen Sie einen Wert benötigen, haben die Fern alle Änderungen drücken und lokal die neuesten Werte zwischenzuspeichern.

Local-Lookups (nach dem ersten get) immer auf dem Laufenden mit allen Overhead-Remoting im Hintergrund durchgeführt wird (auf einem anderen Thread). vorsichtig sein, nur um die Thread-Sicherheit für Nicht-Atomtypen.

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