2009-01-22 18 views
10

Ich wurde vor kurzem gebeten, einige Leistungsprobleme in einer Anwendung zu beheben, die mit Microsoft Composite UI Application Block erstellt wurde - speziell, dass das Laden zu lange gedauert hat.Dependency Injection Startleistung

Dies ist um Microsofts ObjectBuilder-Abhängigkeitsinjektionsframework aufgebaut, das reflection/attributes verwendet, um Klassen zu registrieren. Die Profilerstellung zeigte an, dass die App beim Start einen erheblichen Teil der Zeit für die Reflektion aufgewandt hat, da ObjectBuilder jeden Typ in jeder geladenen Assembly auf der Suche nach zu registrierenden Dingen scannt.

Alternative DI-Frameworks scheinen alle auch Attribute, XML-Konfiguration oder reinen Code zu verwenden.
Es scheint nicht, als wäre eines der anderen attributbasierten Frameworks besser, und ich bin skeptisch bezüglich der Startzeiten, wenn Stapel von XML analysiert werden müssen.
Die reinen Code-basierten Frameworks scheinen, als sollten sie viel schneller sein, aber sie sind auch viel weniger flexibel, so scheint es nicht wirklich eine klare gute Wahl zu sein ...

Dies führte mich zu suchen für DI-Container-Benchmarks, aber die einzige, die ich finden konnte, ist diese: http://www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.html.
Obwohl es ein großartiger Benchmark ist, misst es nur, wie schnell Sie 1 Million Objekte mithilfe des Containers erstellen können. Ich habe kein Interesse daran, 1 Million Objekte zu erstellen, ich möchte nur, dass die App so schnell wie möglich startet, also was ich suche, sind irgendwelche Informationen über DI-Container Startup Kosten, ob es Blogposts, Anekdoten oder sogar etwas so einfaches wie "hier ist eine Möglichkeit, ObjectBuilder schneller zu machen".

Vielen Dank im Voraus

Antwort

3

Haben Sie Startzeiten messen versucht, wenn alle Baugruppen NGEN'd war? Ich habe (zumindest in IronScheme) herausgefunden, dass es in Reflexionsszenarien sehr hilfreich ist (in meinem Fall von 1,5 Sekunden bis 0,1 Sekunden).

+0

vereinbart, die meiste Zeit ist wegen JIT jeder Klasse. –

+0

Soweit ich gesehen habe, hat NGen einen vernachlässigbaren Effekt auf die Reflektionsleistung, die die Quelle dieser Verlangsamung ist. – Bevan

+0

Ich habe nicht versucht, NGEN, aber ich bin mir nicht sicher, ob es eine gute Idee wäre - die betreffende Anwendung ist eine ClickOnce-Client-App, und Dinge müssen nicht in der GAC gehen, um NGEN'ed gehen ? –

0

On es schneller zu machen ...

ich es denke ist wahrscheinlich ein Weg, um das Ergebnis des Start zwischenzuspeichern. Vielleicht verbringt die Anwendung ein bisschen mehr Zeit mit der Reflektion UND speichert das Ergebnis zwischenspeichern. Wenn sich jedoch nichts geändert hat, können Sie beim zweiten Start aus dem Cache laden (was möglicherweise schneller ist).

In Bezug auf die Art dieses Cache kann es sein, dass Objekte auf dem Datenträger serialisiert werden. Als die Frage "nichts geändert" könnte der Startup Checksummen betrachten.

0

Ich weiß nicht über ObjectBuilder, aber neuere Frameworks zur Abhängigkeitsinjektion unterstützen in der Regel Lazy Loading, um die Startleistung zu verbessern. Siehe beispielsweise Lazing Around with Autofac2.

Oder Sie können es manuell tun, wie in Ploehs LazyOrderShipper Beispiel.