2009-10-10 13 views
7

El acoplamiento flojo es maravilloso, por supuesto, pero a menudo me he preguntado qué cableado aéreo dinámico usando un contenedor IoC (por ejemplo, Castle Windsor) tiene un sistema muy acoplado.¿Qué rendimiento superior implican los contenedores de IoC?

Sé que una respuesta detallada dependería de para qué se estaba utilizando el IoC, pero realmente solo estoy tratando de sentir la magnitud del esfuerzo involucrado en el trabajo del IoC.

¿Alguien tiene alguna estadística u otros recursos con respecto a esto?

Gracias

+1

Después de aplicar IoC, es de esperar que su sistema ya no esté bien acoplado. ;) Sugeriría probarlo en una parte de su sistema y (si el rendimiento es crítico) benchmarking. Dudo que haya una diferencia significativa. La mayoría de los cuellos de botella implican recursos externos. – TrueWill

+0

Ya uso IoC, solo me preguntaba si alguien tenía información sobre esto. ¡No tiene sentido refaccionar mi aplicación para un acoplamiento ajustado solo para comparar esto si alguien ya ha intentado algo similar! – UpTheCreek

+0

si quiere la IoC más rápida del mercado, luego consulte code.google.com/p/yadic escrito en F # para .Net y scala para java. Es 3 veces más rápido que Autofac lambda – Xian

Respuesta

9

Hay enlaces sobre el rendimiento
http://realfiction.net/?q=node/143
Hay un resultado

  • construcción normal: 0,0001/0,0002
  • construcción Activador: construcción 0,0069/0,0071
  • de contenedores (Castillo de Windsor): 0.1014/0.1068
  • Construcción de contenedores (Spring.NET): 0,069/0,0722

Pero como se puede ver the Windsor isnt the fastest IoC (Autofac mucho más rápido)

La respuesta correcta es, el rendimiento no importa :) .
Debido a que el correcto uso de IoC, cuando todo el proceso de registro se encuentra en la etapa de inicialización.
En otras palabras, el uso de IoC debe reducir el conteo de su "if else" en tiempo real.

+2

Sí, los clientes no se preocupan por los tiempos de carga. – Crashworks

+0

@Crashworks, en realidad, debido a la reducción del rendimiento en tiempo real, los clientes están muy contentos. – Avram

+0

Estaba siendo sarcástico. – Crashworks

1

Tendrá tiempos de inicialización más lentos, ya que todo se carga cuando se inicia el contenedor. Si el tiempo de inicio no te importa, todos ganan en esa rueda de mala suerte.

+0

Pero, según el primer enlace en la publicación de Avrams, parece que los tiempos de intstantiation del objeto también son mucho más largos. – UpTheCreek

1

La mejor forma de entender qué tan complejo es un contenedor IoC es analizarlo.

En una experiencia en particular, una vez que tomé una tarde entera depurando un simple código 'Hello World' usando plexus, en el que se basa Maven (and here is a helpful link to browse its source code).Es un poco se acercó (examinado defaultPlexusContainer) como:

  • configuración de rutas de clases (a través de classworlds)
  • Creación de una variable de tiempo de ejecución de Contexto (básicamente un mapa), con el fin de propiedades del almacén y variables
  • de configuración análisis sintáctico (descubrimiento de los módulos de metadatos en la ruta de clase, etc.)
  • inicialización:
    • Construcción/instanciación de los servicios
  • Firing ComponentDiscoverers adicionales
  • despido de ComponentDiscovererListeners adicionales

Esto deja un aspecto importante, profundamente en los pasos anteriores: Mirando para arriba un componente. En el plexo, el concepto de Fase envuelve los pasos para la construcción de un Objeto, y esas Fases están generalmente ligadas a un concepto de Personalidad. Sin embargo, para la default setting, esto se realiza mediante la ejecución de las siguientes fases:

  • instanciación de objetos (es decir, new Object())
  • Log Habilitación (es decir, el establecimiento de un registrador para el objeto)
  • Composición : es decir, las operaciones de búsqueda y el establecimiento de la dependencia
    • La estrategia colocador es un punto interesante, pero voy a dejar los detalles por ahora
  • Th e pasar del contexto en el objeto creado
  • El objeto de inicio adicionales procedimiento

La mayor parte de esos pasos son opcionales, y por lo general implican la identificación de una interfaz dada y decir que es el objeto de destino - este es el valor predeterminado para la personalidad del plexo, tenga en cuenta que.

Además, cada objeto puede estar unido a un administrador de ciclo de vida, que en su mayoría hace la diferencia entre un nuevo objeto y un conjunto unitario.

En mi registro en particular: La parte más difícil es en realidad el análisis sintáctico de la configuración y el arranque del contenedor. Después de eso, es probable que no note más diferencia en el rendimiento.

Cuestiones relacionadas