2009-01-22 24 views
10

Niedawno poproszono mnie o rozwiązanie niektórych problemów związanych z wydajnością w aplikacji zbudowanej za pomocą bloku aplikacji Composite UI firmy Microsoft - szczególnie, że ładowanie trwało zbyt długo.Dependency Injection Startup Performance

Jest zbudowany na podstawie struktury wtryskowej Microsoft ObjectBuilder, która wykorzystuje odbicie/atrybuty do rejestrowania klas. Profilowanie wskazało, że podczas uruchamiania aplikacja poświęcała znaczną część czasu na refleksję, ponieważ ObjectBuilder skanuje każdy typ w każdym załadowanym zestawie w poszukiwaniu przedmiotów do zarejestrowania.

Alternatywne struktury DI wszystkie wydają się również używać atrybutów, konfiguracji XML lub czystego kodu.
Nie wydaje się, aby jakikolwiek inny framework oparty na atrybutach był lepszy, a sceptycznie podchodzę do czasów uruchamiania, gdy należy analizować stosy XML, itp.
Struktury oparte na czystym kodzie wydają się być znacznie szybsze, ale są również znacznie mniej elastyczne, więc nie wydaje się, że istnieje wyraźny dobry wybór ...

To doprowadziło mnie do wyszukiwania dla testów porównawczych kontenerów DI, ale jedyną, którą udało mi się znaleźć, jest ta: http://www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.html.
Chociaż jest to świetny test porównawczy, mierzy on jedynie, jak szybko można utworzyć 1 milion obiektów za pomocą kontenera. Nie jestem zainteresowany tworzeniem miliona obiektów, chcę tylko, aby aplikacja uruchamiała się tak szybko, jak to możliwe, więc szukam informacji o kosztach, niezależnie od tego, czy będą to wpisy na blogu, anegdoty, czy nawet coś tak prostego, jak "tutaj jest sposób na przyspieszenie tworzenia ObjectBuildera".

góry dzięki

Odpowiedz

3

Czy próbowałeś mierząc czas uruchamiania, gdy wszystkie zespoły były NGEN'd? Znalazłem (przynajmniej w IronScheme), że bardzo pomaga (w moim przypadku od 1,5 s do 0,1 s) w scenariuszach refleksji.

+0

zgodził się, wiele czasu wynika z JIT każdej klasy. –

+0

O ile widziałem, NGen ma znikomy wpływ na wydajność odbicia, co jest źródłem tego spowolnienia. – Bevan

+0

Nie próbowałem wypróbować NGEN, ale nie jestem pewien, czy byłby to dobry pomysł - aplikacja, o której mowa, to aplikacja kliencka wdrożona ClickOnce, i nie ma rzeczy, które muszą iść w GAC, aby być NGEN'em ? –

0

na uczynienie go szybciej ...

myślę tam chyba sposobem buforować wynik starcie. Może aplikacja poświęci nieco więcej czasu na zrobienie odbicia, a następnie na buforowanie wyniku, ale wtedy, przy drugim uruchomieniu, jeśli nic się nie zmieni, możesz załadować z pamięci podręcznej (która może być szybsza).

Jeśli chodzi o naturę tej pamięci podręcznej, możliwe, że obiekty są serializowane na dysku. Jako pytanie "nic się nie zmieniło", startup mógł spojrzeć na sumy kontrolne.

0

Nie wiem na temat ObjectBuilder, ale ostatnie schematy wtrysku zależnego zazwyczaj obsługują leniwe ładowanie w celu poprawy wydajności uruchamiania. Na przykład zobacz Lazing Around with Autofac2.

Lub możesz to zrobić ręcznie, jak w przykładzie Ploeha na LazyOrderShipper.

Powiązane problemy