Ich versuche, die Leistungseinbußen bei der Kommunikation über AppDomains auf demselben Computer zu minimieren. In meinem Spielzeugbeispiel wird Klasse A in AppDomain 1 geladen. Es erstellt eine AppDomain 2 und lädt dort eine Instanz der Klasse 2 (Klasse 2 erbt von MarshalByRef) und erhält einen Proxy zurück. Dann ruft Klasse 1 wiederholt eine Methode auf dem Proxy auf, die keine Werte zurückgibt.Wie hoch ist die Mindestleistung für die Cross AppDomain-Kommunikationsleistung?
ich folgende Ergebnisse:
- Keine AppDomains werden beide Klassen in derselben AppDomain geladen und die ersten Anrufe repetedly die Methode auf dem zweiten (die Methode keine Parameter): 24 Millionen Verfahren Anrufe/sec
- zwei AppDomain wie oben beschrieben, hat Methode keine Parameter oder String-Parameter "Ausbluten": 340.000 Methoden aufrufen/sec
- zwei AppDomains wie oben beschrieben, ein serializable Parameter (Array von zwei String e): 64.000 Methodenaufrufe/sec
Obwohl ich die Leistungseinbuße zwischen 2 und 3 (Serialisierung) verstehen, ich verstehe wirklich nicht, warum ich 100-mal langsamer bin von Fall 1 bis Fall 2 . Nach dem Erstellen des Proxys müssen alle nachfolgenden Methodenaufrufe wirklich schnell sein, da keine Daten von einer AppDomain zu einer anderen AppDomain gemarshallt werden. Hat jemand jetzt die Kommunikation über AppDomains so langsam? Mache ich etwas falsch?
PS1. Der einzige Tipp, den ich hier habe, ist here: "Und die Kosten für das Überqueren einer AppDomain-Grenze ist peinlich." Ich vermutete, er bezieht sich auf die Serialisierung ...
PS2. Ich zähle die AppDomain- oder Proxy-Erstellungszeit nicht (meine Benchmarks beginnen im ersten Methodenaufruf)
PS3. Ich verwende .NET 3.5 in einer WinXP SP3-Maschine. Ich habe auch .NET 4.0 Beta 1 ohne wesentliche Unterschiede versucht.
+1 Ich stimme Ihnen vollkommen zu. Ein einfacher direkter Methodenaufruf ist extrem einfach. Ein Methodenaufruf durch ** Remoting ** ist viel schwerer. Der Overhead ist viel größer. Die einzige wirkliche Lösung ist ein gutes Anwendungsdesign, das nicht von der Geschwindigkeit der übergreifenden AppDomain-Kommunikation abhängt. – jpbochi