2009-10-10 7 views
7

Lose Kupplung ist natürlich wunderbar, aber ich habe mich oft gefragt, welche Overhead-Verkabelung dynamisch mit einem IoC-Container (zum Beispiel Castle Windsor) über ein eng gekoppeltes System?Welchen Performance Overhead benötigen IoC-Container?

Ich weiß, dass eine detaillierte Antwort davon abhängen würde, wofür der IoC verwendet wurde, aber ich versuche wirklich nur, ein Gefühl dafür zu bekommen, wie viel Aufwand in der IoC-Arbeit steckt.

Hat jemand irgendwelche Statistiken oder andere Ressourcen diesbezüglich?

Dank

+1

Nach dem Anwenden von IoC wird Ihr System hoffentlich nicht mehr eng gekoppelt sein. ;) Ich würde vorschlagen, es auf einem Teil Ihres Systems und (wenn Leistung kritisch ist) Benchmarking zu versuchen. Ich bezweifle, dass es einen signifikanten Unterschied geben wird. Die meisten Engpässe betreffen externe Ressourcen. – TrueWill

+0

Ich benutze bereits IoC - ich habe mich nur gefragt, ob irgendjemand dazu Informationen hatte. Kein Refactoring meiner App für eine enge Kopplung, nur um dies zu bewerten, wenn jemand schon etwas Ähnliches versucht hat! – UpTheCreek

+0

Wenn Sie den schnellsten IoC auf dem Markt haben möchten, besuchen Sie code.google.com/p/yadic in F # für .Net und scala for java. Es ist 3 mal schneller als Autofac Lambda – Xian

Antwort

9

Es gibt Links zu Leistungs
http://realfiction.net/?q=node/143
gibt es ein Ergebnis

  • normal Konstruktion: 0,0001/0,0002
  • Activator Konstruktion: 0,0069/0,0071
  • Bau Container (Schloss Windsor): 0.1014/0.1068
  • Containerbau (Spring.NET): 0,069/0,0722

Aber wie Sie the Windsor isnt the fastest IoC (Autofac viel schneller)

Die richtige Antwort ist zu sehen, ist die Leistung keine Rolle :) .
Weil die korrekte Verwendung von IoC, wenn alle Registrierung Prozess ist in der Initialisierungsphase.
Mit anderen Worten die Verwendung von IoC muss die Anzahl Ihrer "wenn sonst" in Echtzeit reduzieren.

+2

Ja, Kunden kümmern sich nicht um Ladezeiten. – Crashworks

+0

@Crashworks, eigentlich, weil die Echtzeit-Performance zu reduzieren, ist der Kunde ziemlich glücklich. – Avram

+0

Ich war sarkastisch. – Crashworks

1

Sie haben langsamere Initialisierungszeiten, da alles beim Start des Containers geladen wird. Wenn die Init-Zeit dir egal ist, ist jeder ein Gewinner auf diesem Chuck-a-Luck-Rad.

+0

Aber, nach ersten Link auf Avrams Post, scheint es, dass Objekt Intstantiation Zeiten auch viel länger sind? – UpTheCreek

1

Der beste Weg zu verstehen, wie komplex ein IoC-Container ist, kommt von der Analyse.

In einer besonderen Erfahrung, einmal nahm ich einen ganzen Nachmittag Debuggen einige einfache "Hallo Welt" -Code mit plexus, auf denen Maven basiert (and here is a helpful link to browse its source code).Es kam irgendwie nach oben (um defaultPlexusContainer suchen) als:

  • Classpath-Konfiguration (über classworlds)
  • Erstellung einer Runtime Kontextvariable (im Grunde eine Karte), um die Speichereigenschaften und Variablen
  • Konfiguration Parsen (Entdeckung von Modulen Metadaten auf classpath, usw.)
  • Initialisierung:
    • Bau/Instanziierung von Dienstleistungen
  • Firing zusätzliche ComponentDiscoverers
  • Firing zusätzlich ComponentDiscovererListeners

Dies läßt einen wichtigen Aspekt, tief in die oben genannten Schritte: eine Komponente oben betrachten. Im Plexus umfasst das Phasenkonzept die Schritte zur Konstruktion eines Objekts, und diese Phasen sind normalerweise an ein Persönlichkeitskonzept gebunden. Jedoch für den default setting wird dies durch Ausführen der folgenden Phasen:

  • Objektinstanziierung (dh neue Object())
  • Log Enabling (dh Einstellen eines Loggers für das Objekt)
  • Composition : dh Abhängigkeit Lookup und
    • Die Setter-Strategie ist ein interessanter Punkt, Einstellung, aber ich werde die Details jetzt
  • Th verlassen e Passieren des Context in das Objekt erstellt
  • Das Objekt zusätzliche Startprozedur

Die meisten dieser Schritte sind optional, und beinhalten in der Regel eine bestimmte Schnittstelle zu identifizieren und sie auf dem Zielobjekt aufrufen - dies ist die Standardeinstellung für die Plexus-Persönlichkeit, beachte das.

Außerdem kann jedes Objekt an einen Lifecycle-Manager gebunden sein, was meistens den Unterschied zwischen einem neuen Objekt und einem Singleton darstellt.

In meinem bestimmten Datensatz: Der schwierigste Teil ist tatsächlich das Parsen der Konfiguration und das Booten des Containers. Danach werden Sie wahrscheinlich keinen weiteren Leistungsunterschied bemerken.