Próbuję zminimalizować kary za wydajność związane z komunikowaniem się między AppDomains na tym samym komputerze. W moim przykładzie zabawkowym klasa A jest ładowana w AppDomain 1. Tworzy AppDomain 2 i ładuje tam instancję klasy 2 (Class 2 dziedziczy z MarshalByRef), odzyskując proxy. Następnie klasa 1 wielokrotnie wywołuje metodę na serwerze proxy, która nie zwraca żadnych wartości.Jaka jest minimalna kara za wydajność komunikacji Cross AppDomain?
uzyskać następujące wyniki:
- Brak AppDomains, obie klasy są ładowane w tym samym AppDomain i pierwsze zaproszenia repetedly metodę na drugi (metoda ma parametry): metody połączenia/s
- Dwa AppDomain jak opisano powyżej, sposób nie ma parametrów lub „krwawienie” parametry ciągu: 340.000 metody połączeń/sek
- dwa AppDomains jak opisano powyżej, jeden serializacji parametr (tablica dwóch łańcucha s): 64,000 wywołania metod/s
Chociaż rozumiem karę wydajności pomiędzy 2 i 3 (serializacji), ja naprawdę nie rozumiem, dlaczego jestem 100 razy wolniejsze od przypadku do przypadku 1 2 . Według mojego zrozumienia, po utworzeniu proxy wszystkie późniejsze wywołania metod muszą być naprawdę szybkie, ponieważ żadne dane nie są kierowane z jednego AppDomain do drugiego. Czy ktokolwiek wie, dlaczego komunikacja w AppDomains jest tak powolna? czy robię coś źle?
PS1. Jedyną wskazówką, którą mam na ten temat, jest here: "Koszt przekroczenia granicy AppDomain jest kłopotliwy.". Zgaduję, że odnosi się do serializacji ...
PS2. Nie liczę czasu utworzenia AppDomain lub Proxy (moje testy porównawcze rozpoczynają się od pierwszego wywołania metody)
PS3. Korzystam z .NET 3.5 na maszynie WinXP SP3. Próbowałem także .NET 4.0 Beta 1 bez znaczących różnic.
+1 Całkowicie się z tobą zgadzam. Proste bezpośrednie wywołanie metody jest niezwykle proste. Wywołanie metody poprzez ** zdalne ** jest znacznie większe. Narzut jest znacznie większy. Jedynym realnym rozwiązaniem jest dobry projekt aplikacji, który nie zależy od szybkości komunikacji Cross AppDomain. – jpbochi