IoC容器涉及哪些性能开销?

时间:2009-10-10 14:20:24

标签: performance design-patterns inversion-of-control

当然,松散耦合是很棒的,但我常常想知道使用IoC容器(例如Castle Windsor)动态连接的架空线路是通过一个紧密耦合的系统进行的?

我知道详细的答案将取决于IoC的用途,但我真的只是想了解IoC工作所涉及的工作量。

有没有人对此有任何统计数据或其他资源?

由于

3 个答案:

答案 0 :(得分:9)

有关于表现的链接
http://realfiction.net/?q=node/143
结果有

  • 正常构造:0.0001 / 0.0002
  • 活化剂结构:0.0069 / 0.0071
  • 集装箱结构(Castle Windsor):0.1014 / 0.1068
  • 容器构造(Spring.NET):0.069 / 0.0722

但是你可以看到the Windsor isnt the fastest IoC(Autofac更快)

正确的答案是,表现并不重要:) 因为正确使用IoC,所有注册过程都处于初始化阶段。
换句话说,使用IoC必须实时减少“if else”的数量。

答案 1 :(得分:1)

初始化时间较慢,因为在启动容器时会加载所有内容。如果初始时间对你来说无关紧要,那么每个人都是那个运气轮的赢家。

答案 2 :(得分:1)

了解IoC容器的复杂程度的最佳方法来自分析它。

在一次特殊的体验中,我花了一整个下午使用plexus调试一些简单的“Hello World”代码,Maven基于and here is a helpful link to browse its source code)。它有点出现(通过查看defaultPlexusContainer):

  • 类路径配置(通过classworlds)
  • 创建运行时上下文变量(基本上是一个映射),以便存储属性和变量
  • 配置解析(在类路径上发现模块元数据等)
  • 初始化:
    • 建筑/服务实例化
  • 解雇其他ComponentDiscoverers
  • 解雇其他ComponentDiscovererListeners

这留下了一个重要的方面,深入到上面的步骤:查找组件。在丛中,阶段概念包含构造对象的步骤,并且这些阶段通常绑定到人格概念。但是,对于default setting,可以通过执行以下阶段来完成:

  • 对象实例化(即新的Object())
  • 日志启用(即,为对象设置记录器)
  • 组成:即依赖查找和设置
    • 制定者策略是一个有趣的观点,但我现在要留下详细信息
  • 将Context传递给创建的对象
  • 对象附加启动过程

这些步骤中的大多数都是可选的,通常涉及识别给定的接口并在目标对象上调用它 - 这是plexus个性的默认值,请注意。

此外,每个对象可能绑定到生命周期管理器,这主要是新对象和单个对象之间的区别。

在我的特定记录中:最困难的部分实际上是解析配置,并启动容器。之后,您可能会注意到性能没有进一步的差异。