Ich rufe verwalteten Code aus nicht verwaltetem Code mit einem Delegaten auf. Wenn ich verwalteten Code in der Standard-AppDomain anrufe, messen wir durchschnittlich 5,4ns pro Anruf. Wenn ich zu einer zweiten AppDomain anrufe, messe ich 194ns pro Anruf. (Standard VS2017 x86 Release-Konfiguration, nicht unter dem Debugger ausgeführt).
Warum ist die Leistung beim Aufruf einer AppDomain, die nicht die Standardeinstellung ist, so viel niedriger? Da ich von der nicht verwalteten Seite komme, die AppDomains nicht kennt, würde ich erwarten, direkt in die Zieldomäne zu gelangen. Der Leistungshit würde jedoch implizieren, dass der Delegat in die Standarddomäne aufruft und dann zum eigentlichen Ziel marshallt. Ich sehe UM2MDoADCallBack
beim Durchlaufen der Disassemblierung. Was erscheint unter WrongAppDomain:
in UMThunkStub.asm
Wie kann ich dieses unnötige Marshalling verhindern und direkt in eine bestimmte AppDomain aufrufen?
Der Code, mit dem ich das teste, ist unten.
%Vor%Tags und Links interop performance clr c++-cli